mirror of
https://mikeslab.dix.asia/gogs/My-Mods/ANI2Cape.git
synced 2025-10-01 23:14:57 +00:00
Fix transparency missing with indexed color
This commit is contained in:
parent
b4e2de09b2
commit
d57a50bedd
3 changed files with 35 additions and 5 deletions
10
ani2cape.py
10
ani2cape.py
|
@ -14,7 +14,15 @@ def scaleImage(img, scale):
|
|||
|
||||
|
||||
def readCUR(f, width=-1.0, height=-1.0):
|
||||
frameImage = Image.open(f, formats=['cur', 'ico']).convert('RGBA')
|
||||
frameImage = Image.open(f, formats=['cur', 'ico'])
|
||||
if (frameImage.mode == 'P'):
|
||||
palette = list(frameImage.palette.getdata()[1])
|
||||
for i in range(4, len(palette), 4):
|
||||
if sum(palette[i:i + 3]) == 0:
|
||||
break
|
||||
palette[i + 3] = 255
|
||||
frameImage.putpalette(palette, 'BGRA')
|
||||
frameImage = frameImage.convert('RGBA')
|
||||
if (width, height) == (-1.0, -1.0):
|
||||
return frameImage, (float(frameImage.width), float(frameImage.height))
|
||||
if -1 in (width, height):
|
||||
|
|
15
ani2gif.py
15
ani2gif.py
|
@ -46,6 +46,16 @@ def analyzeANIFile(filePath):
|
|||
nowSize += subChunkSize
|
||||
return {"code":0,"msg":frameList,"frameRate":frameRate}
|
||||
|
||||
def CURPaletteFix(image):
|
||||
# type: (Image.ImageFile.ImageFile) -> None
|
||||
if (image.mode == 'P'):
|
||||
palette = list(image.palette.getdata()[1])
|
||||
for i in range(4, len(palette), 4):
|
||||
if sum(palette[i:i + 3]) == 0:
|
||||
break
|
||||
palette[i + 3] = 255
|
||||
image.putpalette(palette, 'BGRA')
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) < 2:
|
||||
logging.fatal("Usage:python ani2gif.py <inputFile> <outputFile,Option>")
|
||||
|
@ -55,8 +65,9 @@ if __name__ == '__main__':
|
|||
if res["code"] == 0:
|
||||
logging.info('ANI文件分析完成,帧提取完成!')
|
||||
for frame in res["msg"]:
|
||||
frameImage = Image.open(io.BytesIO(frame),formats=['CUR']).convert('RGBA')
|
||||
GIFframes.append(frameImage)
|
||||
frameImage = Image.open(io.BytesIO(frame),formats=['CUR'])
|
||||
CURPaletteFix(frameImage)
|
||||
GIFframes.append(frameImage.convert('RGBA'))
|
||||
if(len(sys.argv) >= 3):
|
||||
GIFframes[0].save(sys.argv[2],format="GIF",save_all=True, append_images=GIFframes[1:], optimize=False, duration=res["frameRate"], loop=0, transparency=0, disposal=2)
|
||||
else:
|
||||
|
|
|
@ -46,6 +46,16 @@ def analyzeANIFile(filePath):
|
|||
nowSize += subChunkSize
|
||||
return {"code":0,"msg":frameList,"frameRate":frameRate}
|
||||
|
||||
def CURPaletteFix(image):
|
||||
# type: (Image.ImageFile.ImageFile) -> None
|
||||
if (image.mode == 'P'):
|
||||
palette = list(image.palette.getdata()[1])
|
||||
for i in range(4, len(palette), 4):
|
||||
if sum(palette[i:i + 3]) == 0:
|
||||
break
|
||||
palette[i + 3] = 255
|
||||
image.putpalette(palette, 'BGRA')
|
||||
|
||||
if __name__ == '__main__':
|
||||
OUTPUT_SIZE = (48,48)
|
||||
if len(sys.argv) < 2:
|
||||
|
@ -57,8 +67,9 @@ if __name__ == '__main__':
|
|||
logging.info('ANI文件分析完成,帧提取完成!')
|
||||
output = Image.new("RGBA", (OUTPUT_SIZE[0], OUTPUT_SIZE[1] * len(res["msg"])))
|
||||
for frameIndex in range(len(res["msg"])):
|
||||
frameImage = Image.open(io.BytesIO(res["msg"][frameIndex]),formats=['cur']).convert('RGBA')
|
||||
extracted_frame = frameImage.resize(OUTPUT_SIZE)
|
||||
frameImage = Image.open(io.BytesIO(res["msg"][frameIndex]),formats=['cur'])
|
||||
CURPaletteFix(frameImage)
|
||||
extracted_frame = frameImage.convert('RGBA').resize(OUTPUT_SIZE)
|
||||
position = (0, OUTPUT_SIZE[0] * frameIndex)
|
||||
output.paste(extracted_frame, position)
|
||||
if(len(sys.argv) >= 3):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue