mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-08-15 01:34:45 +03:00
account for pixel size in ImagingTransformAffine()
This commit is contained in:
parent
5b94bf1ce8
commit
c6287ca7bc
|
@ -909,11 +909,12 @@ ImagingTransformAffine(
|
||||||
arithmetics*/
|
arithmetics*/
|
||||||
|
|
||||||
ImagingSectionCookie cookie;
|
ImagingSectionCookie cookie;
|
||||||
int x, y;
|
int x, y, b;
|
||||||
int xin, yin;
|
int xin, yin;
|
||||||
int xsize, ysize;
|
int xsize, ysize;
|
||||||
double xx, yy;
|
double xx, yy;
|
||||||
double xo, yo;
|
double xo, yo;
|
||||||
|
int pixelsize;
|
||||||
|
|
||||||
if (filterid || imIn->type == IMAGING_TYPE_SPECIAL) {
|
if (filterid || imIn->type == IMAGING_TYPE_SPECIAL) {
|
||||||
return ImagingGenericTransform(
|
return ImagingGenericTransform(
|
||||||
|
@ -962,42 +963,35 @@ ImagingTransformAffine(
|
||||||
xo = a[2] + a[1] * 0.5 + a[0] * 0.5;
|
xo = a[2] + a[1] * 0.5 + a[0] * 0.5;
|
||||||
yo = a[5] + a[4] * 0.5 + a[3] * 0.5;
|
yo = a[5] + a[4] * 0.5 + a[3] * 0.5;
|
||||||
|
|
||||||
#define AFFINE_TRANSFORM(pixel, image) \
|
pixelsize = imOut->pixelsize;
|
||||||
for (y = y0; y < y1; y++) { \
|
|
||||||
pixel *out; \
|
|
||||||
xx = xo; \
|
|
||||||
yy = yo; \
|
|
||||||
out = imOut->image[y]; \
|
|
||||||
if (fill && x1 > x0) { \
|
|
||||||
memset(out + x0, 0, (x1 - x0) * sizeof(pixel)); \
|
|
||||||
} \
|
|
||||||
for (x = x0; x < x1; x++, out++) { \
|
|
||||||
xin = COORD(xx); \
|
|
||||||
if (xin >= 0 && xin < xsize) { \
|
|
||||||
yin = COORD(yy); \
|
|
||||||
if (yin >= 0 && yin < ysize) { \
|
|
||||||
*out = imIn->image[yin][xin]; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
xx += a[0]; \
|
|
||||||
yy += a[3]; \
|
|
||||||
} \
|
|
||||||
xo += a[1]; \
|
|
||||||
yo += a[4]; \
|
|
||||||
}
|
|
||||||
|
|
||||||
ImagingSectionEnter(&cookie);
|
ImagingSectionEnter(&cookie);
|
||||||
|
for (y = y0; y < y1; y++) {
|
||||||
if (imIn->image8) {
|
UINT8 *out;
|
||||||
AFFINE_TRANSFORM(UINT8, image8)
|
xx = xo;
|
||||||
} else {
|
yy = yo;
|
||||||
AFFINE_TRANSFORM(INT32, image32)
|
out = (UINT8 *)imOut->image[y];
|
||||||
|
if (fill && x1 > x0) {
|
||||||
|
memset(out + x0 * pixelsize, 0, (x1 - x0) * pixelsize);
|
||||||
|
}
|
||||||
|
for (x = x0; x < x1; x++) {
|
||||||
|
xin = COORD(xx);
|
||||||
|
if (xin >= 0 && xin < xsize) {
|
||||||
|
yin = COORD(yy);
|
||||||
|
if (yin >= 0 && yin < ysize) {
|
||||||
|
for (b = 0; b < pixelsize; b++) {
|
||||||
|
out[x * pixelsize + b] = (UINT8 *)imIn->image[yin][xin * pixelsize + b];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
xx += a[0];
|
||||||
|
yy += a[3];
|
||||||
|
}
|
||||||
|
xo += a[1];
|
||||||
|
yo += a[4];
|
||||||
}
|
}
|
||||||
|
|
||||||
ImagingSectionLeave(&cookie);
|
ImagingSectionLeave(&cookie);
|
||||||
|
|
||||||
#undef AFFINE_TRANSFORM
|
|
||||||
|
|
||||||
return imOut;
|
return imOut;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user