2
0
فهرست منبع

Fix transparency missing with indexed color

Mike L 2 روز پیش
والد
کامیت
e76eaf9443
3فایلهای تغییر یافته به همراه35 افزوده شده و 3 حذف شده
  1. 9 1
      ani2cape.py
  2. 13 1
      ani2gif.py
  3. 13 1
      ani2spritesheet.py

+ 9 - 1
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):

+ 13 - 1
ani2gif.py

@@ -46,6 +46,17 @@ 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')
+        image = image.convert('RGBA')
+
 if __name__ == '__main__':
     if len(sys.argv) < 2:
         logging.fatal("Usage:python ani2gif.py <inputFile> <outputFile,Option>")
@@ -55,7 +66,8 @@ 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')
+                frameImage = Image.open(io.BytesIO(frame),formats=['CUR'])
+                CURPaletteFix(image)
                 GIFframes.append(frameImage)
             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)

+ 13 - 1
ani2spritesheet.py

@@ -46,6 +46,17 @@ 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')
+        image = image.convert('RGBA')
+
 if __name__ == '__main__':
     OUTPUT_SIZE = (48,48)
     if len(sys.argv) < 2:
@@ -57,7 +68,8 @@ 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')
+                frameImage = Image.open(io.BytesIO(res["msg"][frameIndex]),formats=['cur'])
+                CURPaletteFix(frameImage)
                 extracted_frame = frameImage.resize(OUTPUT_SIZE)
                 position = (0, OUTPUT_SIZE[0] * frameIndex)
                 output.paste(extracted_frame, position)