I wrote a patch for CMYK undercolor removal for the "dumb" (non-ICC)
conversion a while ago, but I think I never posted it anywhere - so here
goes (it works flawlessly as far as I can tell, but I as I'm no seasoned
C-programmer the code is maybe not very efficient). Only drawback I can
think of is that the results are of course inconsistent with previous
PIL versions, but you gain the benefit that the conversion can be easily
inverted.
Something else I'd like to see is 16-bits-per-channel support for image
types that can do it (hmm, TIFF, PSD?), but I have no idea how much work
that'd be, so maybe not for 1.1.7.
Regards,
Florian Höch
Fredrik Lundh wrote:
By the way, here's a rough version history for the current 1.1.7
snapshot available from here:
http://bitbucket.org/effbot/pil-2009-raclette/src/874f7005c34c/
Let me know if I've missed some patch that absolutely should go into
1.1.7, or some bug that absolutely needs to be fixed.
cheers /F
--- Convert.c.bak Sun Dec 03 12:37:26 2006
+++ Convert.c Sat Mar 14 09:22:51 2009
@@ -309,12 +309,38 @@
rgb2cmyk(UINT8* out, const UINT8* in, int xsize)
{
int x;
- for (x = 0; x < xsize; x++) {
- /* Note: no undercolour removal */
- *out++ = ~(*in++);
- *out++ = ~(*in++);
- *out++ = ~(*in++);
- *out++ = 0; in++;
+ int R;
+ int G;
+ int B;
+ float C;
+ float M;
+ float Y;
+ int K;
+ for (x = 0; x < xsize; x++, in += 4) {
+ R = in[0];
+ G = in[1];
+ B = in[2];
+
+ C = 255 - R;
+ M = 255 - G;
+ Y = 255 - B;
+ K = 255;
+ if (C < K) { K = C; }
+ if (M < K) { K = M; }
+ if (Y < K) { K = Y; }
+ if (K < 255) {
+ C = (C - K) / (255 - K) * 255;
+ M = (M - K) / (255 - K) * 255;
+ Y = (Y - K) / (255 - K) * 255;
+ } else {
+ C = 0;
+ M = 0;
+ Y = 0;
+ }
+ *out++ = C;
+ *out++ = M;
+ *out++ = Y;
+ *out++ = K;
}
}
@@ -322,11 +348,24 @@
cmyk2rgb(UINT8* out, const UINT8* in, int xsize)
{
int x;
+ float C;
+ float M;
+ float Y;
+ int K;
for (x = 0; x < xsize; x++, in += 4) {
- *out++ = CLIP(255 - (in[0] + in[3]));
- *out++ = CLIP(255 - (in[1] + in[3]));
- *out++ = CLIP(255 - (in[2] + in[3]));
- *out++ = 255;
+ C = in[0];
+ M = in[1];
+ Y = in[2];
+ K = in[3];
+ if (K > 0) {
+ C = (C / 255) * (255 - K) + K;
+ M = (M / 255) * (255 - K) + K;
+ Y = (Y / 255) * (255 - K) + K;
+ }
+ *out++ = 255 - C;
+ *out++ = 255 - M;
+ *out++ = 255 - Y;
+ *out++ = 255;
}
}
_______________________________________________
Image-SIG maillist - Image-SIG@python.org
http://mail.python.org/mailman/listinfo/image-sig