浏览代码

remove white matting when loading transparent PSD

Sean Barrett 9 年之前
父节点
当前提交
591c7f8cb3
共有 1 个文件被更改,包括 18 次插入2 次删除
  1. 18 2
      stb_image.h

+ 18 - 2
stb_image.h

@@ -201,10 +201,11 @@
     Janez Zemva             John Bartholomew   Michal Cichon      svdijk@github
     Jonathan Blow           Ken Hamada         Tero Hanninen      Baldur Karlsson
     Laurent Gomila          Cort Stratton      Sergio Gonzalez    romigrou@github
-    Aruelien Pocheville     Thibault Reuille   Cass Everitt
+    Aruelien Pocheville     Thibault Reuille   Cass Everitt       
     Ryamond Barbiero        Paul Du Bois       Engin Manap
+    Michaelangel007@github  Oriol Ferrer Mesia
     Blazej Dariusz Roszkowski
-    Michaelangel007@github
+    Oriol Ferrer Mesia
 
 
 LICENSE
@@ -5453,6 +5454,21 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int
       }
    }
 
+   if (channelCount >= 3) {
+      for (i=0; i < w*h; ++i) {
+         unsigned char *pixel = out + 4*i;
+         if (pixel[3] != 0 && pixel[3] != 255) {
+            // remove weird white matte from PSD
+            float a = pixel[3] / 255.0f;
+            float ra = 1.0f / a;
+            float inv_a = 255.0f * (1 - ra);
+            pixel[0] = (unsigned char) (pixel[0]*ra + inv_a);
+            pixel[1] = (unsigned char) (pixel[1]*ra + inv_a);
+            pixel[2] = (unsigned char) (pixel[2]*ra + inv_a);
+         }
+      }
+   }
+
    if (req_comp && req_comp != 4) {
       out = stbi__convert_format(out, 4, req_comp, w, h);
       if (out == NULL) return out; // stbi__convert_format frees input on failure