Reposting in plain text:

---------- Forwarded message ----------
From: Alexey Borzenkov <[EMAIL PROTECTED]>
Date: Feb 3, 2007 2:08 PM
Subject: Inconsistency with BGR packing
To: image-sig@python.org


Hi everyone,

Yesterday I've tried using PIL to load and save .bmp files that
contain alpha channel. Well, loading was easy to do without even
modifying the library:

from PIL import BmpImagePlugin
BmpImagePlugin.BIT2MODE [32] = ("RGBA", "BGRA")
BmpImagePlugin.SAVE["RGBA"] = ("BGRA", 32, 0)

However when I tried to save bitmap after loading it I suddenly found
that packing into BGRA is not supported. I wonder if this was decided
some time ago as "the right thing", or if this was just accidentally
left out? (as it seems inconsistent to me that it can unpack
BGRA/ABGR, but can't pack it back) Fix for this is pretty trivial, but
as it contains tabulation characters in addition to seeing it below
you can download it here:
http://snaury.googlepages.com/Imaging-1.1.6-df-bgr.patch

I hope here is the right place to submit a patch, as PIL site told to
do so. And if what's done below is in any way wrong, I'd like to hear
your reasons.

diff -druN Imaging-1.1.6-orig/libImaging/Pack.c Imaging-1.1.6/libImaging/Pack.c
--- Imaging-1.1.6-orig/libImaging/Pack.c    Sun Dec  3 14:37:25 2006
+++ Imaging-1.1.6/libImaging/Pack.c    Sat Feb  3 09:56:20 2007
@@ -287,6 +287,34 @@
     }
 }

+void
+ImagingPackBGRA(UINT8* out, const UINT8* in, int pixels)
+{
+    int i;
+    /* BGRX, reversed bytes with right padding */
+    for (i = 0; i < pixels; i++) {
+    out[0] = in[B];
+    out[1] = in[G];
+    out[2] = in[R];
+    out[3] = in[A];
+    out += 4; in += 4;
+    }
+}
+
+void
+ImagingPackABGR(UINT8* out, const UINT8* in, int pixels)
+{
 +    int i;
+    /* XBGR, reversed bytes with left padding */
+    for (i = 0; i < pixels; i++) {
+    out[0] = in[A];
+    out[1] = in[B];
+    out[2] = in[G];
+    out[3] = in[R];
+    out += 4; in += 4;
+    }
+}
+
 static void
 packRGBL(UINT8* out, const UINT8* in, int pixels)
 {
@@ -460,6 +488,9 @@
     {"RGBA",    "RGBA",        32,    copy4},
     {"RGBA",    "RGBA;L",    32,    packRGBXL},
     {"RGBA",    "RGB",        24,    ImagingPackRGB},
+    {"RGBA",    "BGR",        24,    ImagingPackBGR},
+    {"RGBA",    "BGRA",        32,    ImagingPackBGRA},
+    {"RGBA",    "ABGR",        32,    ImagingPackABGR},
     {"RGBA",       "R",            8,      band0},
     {"RGBA",       "G",            8,      band1},
     {"RGBA",       "B",            8,      band2},
@@ -469,6 +500,9 @@
     {"RGBX",    "RGBX",        32,    copy4},
     {"RGBX",    "RGBX;L",    32,    packRGBXL},
     {"RGBX",    "RGB",        32,    ImagingPackRGB},
+    {"RGBX",    "BGR",        32,    ImagingPackBGR},
+    {"RGBX",    "BGRX",        32,    ImagingPackBGRX},
+    {"RGBX",    "XBGR",        32,    ImagingPackXBGR},
     {"RGBX",       "R",            8,      band0},
     {"RGBX",       "G",            8,      band1},
     {"RGBX",       "B",            8,      band2},
_______________________________________________
Image-SIG maillist  -  Image-SIG@python.org
http://mail.python.org/mailman/listinfo/image-sig

Reply via email to