conquest_develop
bobloy 3 years ago
parent 8acca64264
commit 6762d3cbde

@ -4,7 +4,7 @@ import logging
import pathlib import pathlib
import shutil import shutil
from io import BytesIO from io import BytesIO
from typing import List, Union from typing import List, Union, Optional
from PIL import Image, ImageChops, ImageColor, ImageDraw, ImageFont, ImageOps from PIL import Image, ImageChops, ImageColor, ImageDraw, ImageFont, ImageOps
from PIL.ImageDraw import _color_diff from PIL.ImageDraw import _color_diff
@ -12,6 +12,9 @@ from PIL.ImageDraw import _color_diff
log = logging.getLogger("red.fox_v3.conquest.regioner") log = logging.getLogger("red.fox_v3.conquest.regioner")
MAP_FONT: Optional[ImageFont.ImageFont] = None
async def composite_regions(im, regions, color, masks_path) -> Union[Image.Image, None]: async def composite_regions(im, regions, color, masks_path) -> Union[Image.Image, None]:
im2 = Image.new("RGB", im.size, color) im2 = Image.new("RGB", im.size, color)
@ -115,19 +118,31 @@ def create_number_mask(regions, filepath, filename):
if not base_img_path.exists(): if not base_img_path.exists():
return False return False
base_img: Image.Image = Image.open(base_img_path).convert("L") base_img: Image.Image = Image.open(base_img_path)
number_img = Image.new("L", base_img.size, 255) number_img = Image.new("L", base_img.size, 255)
fnt = ImageFont.load_default() background_img = Image.new("L", base_img.size, 255)
number2_img = Image.new("L", base_img.size, 255)
if MAP_FONT is None:
fnt = ImageFont.load_default()
else:
fnt = MAP_FONT
d = ImageDraw.Draw(number_img) d = ImageDraw.Draw(number_img)
d2 = ImageDraw.Draw(background_img)
d3 = ImageDraw.Draw(number2_img)
for region_num, region in regions.items(): for region_num, region in regions.items():
text = getattr(region, "name", str(region_num)) text = getattr(region, "name", str(region_num))
w1, h1 = region.center w1, h1 = region.center
w2, h2 = fnt.getsize(text) w2, h2 = fnt.getsize(text)
d2.rectangle((w1 - (w2 / 2), h1 - (h2 / 2)-1, w1 + (w2 / 2)-1, h1 + (h2 / 2)), fill=0)
d3.rectangle((w1 - (w2 / 2), h1 - (h2 / 2)-1, w1 + (w2 / 2)-1, h1 + (h2 / 2)), fill=0)
d3.text((w1 - (w2 / 2), h1 - (h2 / 2)), text, font=fnt, fill=255)
d.text((w1 - (w2 / 2), h1 - (h2 / 2)), text, font=fnt, fill=0) d.text((w1 - (w2 / 2), h1 - (h2 / 2)), text, font=fnt, fill=0)
number_img.save(filepath / f"numbers.png", "PNG") number_img.save(filepath / "numbers.png", "PNG")
background_img.save(filepath / "numbers_background.png", "PNG")
number2_img.save(filepath / "numbers2.png", "PNG")
return True return True
@ -155,6 +170,12 @@ class ConquestMap:
def numbered_path(self): def numbered_path(self):
return self.path / "numbered.png" return self.path / "numbered.png"
def numbers_background_path(self):
return self.path / "numbers_background.png"
def numbers2_path(self):
return self.path / "numbers2.png"
def load_data(self): def load_data(self):
with self.data_path().open() as dp: with self.data_path().open() as dp:
data = json.load(dp) data = json.load(dp)
@ -208,7 +229,6 @@ class ConquestMap:
masks_dir = self.masks_path() masks_dir = self.masks_path()
if masks_dir.exists() and masks_dir.is_dir(): if masks_dir.exists() and masks_dir.is_dir():
loop = asyncio.get_running_loop()
current_map = Image.open(self.blank_path()) current_map = Image.open(self.blank_path())
if region is not None: if region is not None:
@ -264,6 +284,11 @@ class ConquestMap:
return buffer1 return buffer1
async def get_numbered(self, current_map): async def get_numbered(self, current_map):
# return await self.get_inverted_numbered(current_map)
return await self.get_numbered_with_background(current_map)
async def get_inverted_numbered(self, current_map):
loop = asyncio.get_running_loop() loop = asyncio.get_running_loop()
numbers = Image.open(self.numbers_path()).convert("L") numbers = Image.open(self.numbers_path()).convert("L")
inverted_map = ImageOps.invert(current_map) inverted_map = ImageOps.invert(current_map)
@ -272,6 +297,23 @@ class ConquestMap:
) )
return current_numbered_img return current_numbered_img
async def get_numbered_with_background(self, current_map):
loop = asyncio.get_running_loop()
current_map = current_map.convert("RGBA")
# numbers = Image.open(self.numbers_path()).convert("L")
numbers_mask = Image.open(self.numbers_background_path()).convert("L")
numbers_background = Image.open(self.numbers2_path()).convert("RGB")
# inverted_map = ImageOps.invert(current_map)
# current_numbered_img = await loop.run_in_executor(
# None, Image.composite, current_map, inverted_map, numbers
# )
current_numbered_img = await loop.run_in_executor(
None, Image.composite, current_map, numbers_background, numbers_mask
)
return current_numbered_img
class MapMaker(ConquestMap): class MapMaker(ConquestMap):
async def change_name(self, new_name: str, new_path: pathlib.Path): async def change_name(self, new_name: str, new_path: pathlib.Path):

Loading…
Cancel
Save