Pillow
78 строк · 2.2 Кб
1/*
2* The Python Imaging Library
3* $Id$
4*
5* colour and luminance matrix transforms
6*
7* history:
8* 1996-05-18 fl: created (brute force implementation)
9*
10* Copyright (c) Fredrik Lundh 1996.
11* Copyright (c) Secret Labs AB 1997.
12*
13* See the README file for information on usage and redistribution.
14*/
15
16#include "Imaging.h"17
18#define CLIPF(v) ((v <= 0.0) ? 0 : (v >= 255.0F) ? 255 : (UINT8)v)19
20Imaging
21ImagingConvertMatrix(Imaging im, const char *mode, float m[]) {22Imaging imOut;23int x, y;24ImagingSectionCookie cookie;25
26/* Assume there's enough data in the buffer */27if (!im || im->bands != 3) {28return (Imaging)ImagingError_ModeError();29}30
31if (strcmp(mode, "L") == 0) {32imOut = ImagingNewDirty("L", im->xsize, im->ysize);33if (!imOut) {34return NULL;35}36
37ImagingSectionEnter(&cookie);38for (y = 0; y < im->ysize; y++) {39UINT8 *in = (UINT8 *)im->image[y];40UINT8 *out = (UINT8 *)imOut->image[y];41
42for (x = 0; x < im->xsize; x++) {43float v = m[0] * in[0] + m[1] * in[1] + m[2] * in[2] + m[3] + 0.5;44out[x] = CLIPF(v);45in += 4;46}47}48ImagingSectionLeave(&cookie);49
50} else if (strlen(mode) == 3) {51imOut = ImagingNewDirty(mode, im->xsize, im->ysize);52if (!imOut) {53return NULL;54}55
56for (y = 0; y < im->ysize; y++) {57UINT8 *in = (UINT8 *)im->image[y];58UINT8 *out = (UINT8 *)imOut->image[y];59
60ImagingSectionEnter(&cookie);61for (x = 0; x < im->xsize; x++) {62float v0 = m[0] * in[0] + m[1] * in[1] + m[2] * in[2] + m[3] + 0.5;63float v1 = m[4] * in[0] + m[5] * in[1] + m[6] * in[2] + m[7] + 0.5;64float v2 = m[8] * in[0] + m[9] * in[1] + m[10] * in[2] + m[11] + 0.5;65out[0] = CLIPF(v0);66out[1] = CLIPF(v1);67out[2] = CLIPF(v2);68in += 4;69out += 4;70}71ImagingSectionLeave(&cookie);72}73} else {74return (Imaging)ImagingError_ModeError();75}76
77return imOut;78}
79