Added manga-py source
This commit is contained in:
66
manga-py-stable_1.x/manga_py/crypt/puzzle.py
Normal file
66
manga-py-stable_1.x/manga_py/crypt/puzzle.py
Normal file
@@ -0,0 +1,66 @@
|
||||
from PIL import Image
|
||||
|
||||
|
||||
class Puzzle:
|
||||
need_copy_orig = False
|
||||
|
||||
__x = 0
|
||||
__y = 0
|
||||
__multiply = 1
|
||||
__matrix = None
|
||||
__image_src = None
|
||||
__image_dst = None
|
||||
__block_width = None
|
||||
__block_height = None
|
||||
|
||||
def __init__(self, x: int, y: int, matrix: dict, multiply: int = 1):
|
||||
self.__x = x
|
||||
self.__y = y
|
||||
self.__matrix = matrix
|
||||
self.__multiply = multiply
|
||||
|
||||
def de_scramble(self, path_src: str, path_dst: str):
|
||||
self.__image_src = Image.open(path_src, 'r')
|
||||
self._process()
|
||||
self.__image_dst.save(path_dst)
|
||||
self.__image_src.close()
|
||||
self.__image_dst.close()
|
||||
|
||||
def _process(self):
|
||||
self.__image_dst = Image.new(self.__image_src.mode, self.__image_src.size)
|
||||
self._calc_block_size()
|
||||
self._check_copy_orig_image()
|
||||
self._solve_matrix()
|
||||
|
||||
def _check_copy_orig_image(self):
|
||||
if self.need_copy_orig:
|
||||
self.__image_dst.paste(self.__image_src)
|
||||
|
||||
def _calc_block_size(self):
|
||||
if self.__multiply <= 1:
|
||||
self.__block_width = int(self.__image_src.size[0] / self.__x)
|
||||
self.__block_height = int(self.__image_src.size[1] / self.__y)
|
||||
else:
|
||||
self.__block_width = self.__multiply * int(self.__image_src.size[0] / self.__y / self.__multiply)
|
||||
self.__block_height = self.__multiply * int(self.__image_src.size[1] / self.__x / self.__multiply)
|
||||
|
||||
def _src_rect(self, i):
|
||||
row = int(i / self.__x)
|
||||
col = i - row * self.__x
|
||||
x = col * self.__block_width
|
||||
y = row * self.__block_height
|
||||
return x, y, x + self.__block_width, y + self.__block_height
|
||||
|
||||
def _dst_rect(self, i):
|
||||
row = int(self.__matrix[i] / self.__x)
|
||||
col = self.__matrix[i] - row * self.__y
|
||||
x = col * self.__block_width
|
||||
y = row * self.__block_height
|
||||
return x, y, x + self.__block_width, y + self.__block_height
|
||||
|
||||
def _solve_matrix(self):
|
||||
for i in range(self.__x * self.__y):
|
||||
src_rect = self._src_rect(i)
|
||||
dst_rect = self._dst_rect(i)
|
||||
region = self.__image_src.crop(src_rect)
|
||||
self.__image_dst.paste(region, dst_rect)
|
||||
Reference in New Issue
Block a user