mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-08-15 01:34:45 +03:00
account for pixel size in ImagingScaleAffine()
This commit is contained in:
parent
a2c95d9141
commit
5b94bf1ce8
|
@ -731,11 +731,12 @@ ImagingScaleAffine(
|
||||||
/* scale, nearest neighbour resampling */
|
/* scale, nearest neighbour resampling */
|
||||||
|
|
||||||
ImagingSectionCookie cookie;
|
ImagingSectionCookie cookie;
|
||||||
int x, y;
|
int x, y, b;
|
||||||
int xin;
|
int xin;
|
||||||
double xo, yo;
|
double xo, yo;
|
||||||
int xmin, xmax;
|
int xmin, xmax;
|
||||||
int *xintab;
|
int *xintab;
|
||||||
|
int pixelsize;
|
||||||
|
|
||||||
if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) {
|
if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) {
|
||||||
return (Imaging)ImagingError_ModeError();
|
return (Imaging)ImagingError_ModeError();
|
||||||
|
@ -782,35 +783,28 @@ ImagingScaleAffine(
|
||||||
xo += a[0];
|
xo += a[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
#define AFFINE_SCALE(pixel, image) \
|
pixelsize = imOut->pixelsize;
|
||||||
for (y = y0; y < y1; y++) { \
|
|
||||||
int yi = COORD(yo); \
|
|
||||||
pixel *in, *out; \
|
|
||||||
out = imOut->image[y]; \
|
|
||||||
if (fill && x1 > x0) { \
|
|
||||||
memset(out + x0, 0, (x1 - x0) * sizeof(pixel)); \
|
|
||||||
} \
|
|
||||||
if (yi >= 0 && yi < imIn->ysize) { \
|
|
||||||
in = imIn->image[yi]; \
|
|
||||||
for (x = xmin; x < xmax; x++) { \
|
|
||||||
out[x] = in[xintab[x]]; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
yo += a[4]; \
|
|
||||||
}
|
|
||||||
|
|
||||||
ImagingSectionEnter(&cookie);
|
ImagingSectionEnter(&cookie);
|
||||||
|
for (y = y0; y < y1; y++) {
|
||||||
if (imIn->image8) {
|
int yi = COORD(yo);
|
||||||
AFFINE_SCALE(UINT8, image8);
|
UINT8 *in, *out;
|
||||||
} else {
|
out = (UINT8 *)imOut->image[y];
|
||||||
AFFINE_SCALE(INT32, image32);
|
if (fill && x1 > x0) {
|
||||||
|
memset(out + x0 * pixelsize, 0, (x1 - x0) * pixelsize);
|
||||||
|
}
|
||||||
|
if (yi >= 0 && yi < imIn->ysize) {
|
||||||
|
in = (UINT8 *)imIn->image[yi];
|
||||||
|
for (x = xmin; x < xmax; x++) {
|
||||||
|
for (b = 0; b < pixelsize; b++) {
|
||||||
|
out[x * pixelsize + b] = in[xintab[x] * pixelsize + b];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
yo += a[4];
|
||||||
}
|
}
|
||||||
|
|
||||||
ImagingSectionLeave(&cookie);
|
ImagingSectionLeave(&cookie);
|
||||||
|
|
||||||
#undef AFFINE_SCALE
|
|
||||||
|
|
||||||
free(xintab);
|
free(xintab);
|
||||||
|
|
||||||
return imOut;
|
return imOut;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user