mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-01-27 09:44:31 +03:00
commit
07fa92ba5b
|
@ -2636,11 +2636,9 @@ def merge(mode, bands):
|
||||||
raise ValueError("mode mismatch")
|
raise ValueError("mode mismatch")
|
||||||
if im.size != bands[0].size:
|
if im.size != bands[0].size:
|
||||||
raise ValueError("size mismatch")
|
raise ValueError("size mismatch")
|
||||||
im = core.new(mode, bands[0].size)
|
for band in bands:
|
||||||
for i in range(getmodebands(mode)):
|
band.load()
|
||||||
bands[i].load()
|
return bands[0]._new(core.merge(mode, *[b.im for b in bands]))
|
||||||
im.putband(bands[i].im, i)
|
|
||||||
return bands[0]._new(im)
|
|
||||||
|
|
||||||
|
|
||||||
# --------------------------------------------------------------------
|
# --------------------------------------------------------------------
|
||||||
|
|
24
_imaging.c
24
_imaging.c
|
@ -1888,6 +1888,29 @@ _putband(ImagingObject* self, PyObject* args)
|
||||||
return Py_None;
|
return Py_None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PyObject*
|
||||||
|
_merge(PyObject* self, PyObject* args)
|
||||||
|
{
|
||||||
|
char* mode;
|
||||||
|
ImagingObject *band0 = NULL;
|
||||||
|
ImagingObject *band1 = NULL;
|
||||||
|
ImagingObject *band2 = NULL;
|
||||||
|
ImagingObject *band3 = NULL;
|
||||||
|
Imaging bands[4] = {NULL, NULL, NULL, NULL};
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "sO!|O!O!O!", &mode,
|
||||||
|
&Imaging_Type, &band0, &Imaging_Type, &band1,
|
||||||
|
&Imaging_Type, &band2, &Imaging_Type, &band3))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (band0) bands[0] = band0->image;
|
||||||
|
if (band1) bands[1] = band1->image;
|
||||||
|
if (band2) bands[2] = band2->image;
|
||||||
|
if (band3) bands[3] = band3->image;
|
||||||
|
|
||||||
|
return PyImagingNew(ImagingMerge(mode, bands));
|
||||||
|
}
|
||||||
|
|
||||||
static PyObject*
|
static PyObject*
|
||||||
_split(ImagingObject* self, PyObject* args)
|
_split(ImagingObject* self, PyObject* args)
|
||||||
{
|
{
|
||||||
|
@ -3325,6 +3348,7 @@ static PyMethodDef functions[] = {
|
||||||
{"blend", (PyCFunction)_blend, 1},
|
{"blend", (PyCFunction)_blend, 1},
|
||||||
{"fill", (PyCFunction)_fill, 1},
|
{"fill", (PyCFunction)_fill, 1},
|
||||||
{"new", (PyCFunction)_new, 1},
|
{"new", (PyCFunction)_new, 1},
|
||||||
|
{"merge", (PyCFunction)_merge, 1},
|
||||||
|
|
||||||
{"getcount", (PyCFunction)_getcount, 1},
|
{"getcount", (PyCFunction)_getcount, 1},
|
||||||
|
|
||||||
|
|
|
@ -23,9 +23,9 @@
|
||||||
|
|
||||||
|
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
#define MAKE_UINT32(u0, u1, u2, u3) (u3 | (u2<<8) | (u1<<16) | (u0<<24))
|
#define MAKE_UINT32(u0, u1, u2, u3) (u3 | (u2<<8) | (u1<<16) | (u0<<24))
|
||||||
#else
|
#else
|
||||||
#define MAKE_UINT32(u0, u1, u2, u3) (u0 | (u1<<8) | (u2<<16) | (u3<<24))
|
#define MAKE_UINT32(u0, u1, u2, u3) (u0 | (u1<<8) | (u2<<16) | (u3<<24))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -234,3 +234,77 @@ ImagingFillBand(Imaging imOut, int band, int color)
|
||||||
|
|
||||||
return imOut;
|
return imOut;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Imaging
|
||||||
|
ImagingMerge(const char* mode, Imaging bands[4])
|
||||||
|
{
|
||||||
|
int i, x, y;
|
||||||
|
int bandsCount = 0;
|
||||||
|
Imaging imOut;
|
||||||
|
Imaging firstBand;
|
||||||
|
|
||||||
|
firstBand = bands[0];
|
||||||
|
if ( ! firstBand) {
|
||||||
|
return (Imaging) ImagingError_ValueError("wrong number of bands");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < 4; ++i) {
|
||||||
|
if ( ! bands[i]) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (bands[i]->bands != 1) {
|
||||||
|
return (Imaging) ImagingError_ModeError();
|
||||||
|
}
|
||||||
|
if (bands[i]->xsize != firstBand->xsize
|
||||||
|
|| bands[i]->ysize != firstBand->ysize) {
|
||||||
|
return (Imaging) ImagingError_Mismatch();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bandsCount = i;
|
||||||
|
|
||||||
|
imOut = ImagingNewDirty(mode, firstBand->xsize, firstBand->ysize);
|
||||||
|
if ( ! imOut)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (imOut->bands != bandsCount) {
|
||||||
|
ImagingDelete(imOut);
|
||||||
|
return (Imaging) ImagingError_ValueError("wrong number of bands");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (imOut->bands == 1)
|
||||||
|
return ImagingCopy2(imOut, firstBand);
|
||||||
|
|
||||||
|
if (imOut->bands == 2) {
|
||||||
|
for (y = 0; y < imOut->ysize; y++) {
|
||||||
|
UINT8* in0 = bands[0]->image8[y];
|
||||||
|
UINT8* in1 = bands[1]->image8[y];
|
||||||
|
UINT32* out = (UINT32*) imOut->image32[y];
|
||||||
|
for (x = 0; x < imOut->xsize; x++) {
|
||||||
|
out[x] = MAKE_UINT32(in0[x], 0, 0, in1[x]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (imOut->bands == 3) {
|
||||||
|
for (y = 0; y < imOut->ysize; y++) {
|
||||||
|
UINT8* in0 = bands[0]->image8[y];
|
||||||
|
UINT8* in1 = bands[1]->image8[y];
|
||||||
|
UINT8* in2 = bands[2]->image8[y];
|
||||||
|
UINT32* out = (UINT32*) imOut->image32[y];
|
||||||
|
for (x = 0; x < imOut->xsize; x++) {
|
||||||
|
out[x] = MAKE_UINT32(in0[x], in1[x], in2[x], 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (imOut->bands == 4) {
|
||||||
|
for (y = 0; y < imOut->ysize; y++) {
|
||||||
|
UINT8* in0 = bands[0]->image8[y];
|
||||||
|
UINT8* in1 = bands[1]->image8[y];
|
||||||
|
UINT8* in2 = bands[2]->image8[y];
|
||||||
|
UINT8* in3 = bands[3]->image8[y];
|
||||||
|
UINT32* out = (UINT32*) imOut->image32[y];
|
||||||
|
for (x = 0; x < imOut->xsize; x++) {
|
||||||
|
out[x] = MAKE_UINT32(in0[x], in1[x], in2[x], in3[x]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return imOut;
|
||||||
|
}
|
||||||
|
|
|
@ -266,6 +266,7 @@ extern Imaging ImagingFlipTopBottom(Imaging imOut, Imaging imIn);
|
||||||
extern Imaging ImagingGaussianBlur(Imaging imOut, Imaging imIn, float radius,
|
extern Imaging ImagingGaussianBlur(Imaging imOut, Imaging imIn, float radius,
|
||||||
int passes);
|
int passes);
|
||||||
extern Imaging ImagingGetBand(Imaging im, int band);
|
extern Imaging ImagingGetBand(Imaging im, int band);
|
||||||
|
extern Imaging ImagingMerge(const char* mode, Imaging bands[4]);
|
||||||
extern int ImagingSplit(Imaging im, Imaging bands[4]);
|
extern int ImagingSplit(Imaging im, Imaging bands[4]);
|
||||||
extern int ImagingGetBBox(Imaging im, int bbox[4]);
|
extern int ImagingGetBBox(Imaging im, int bbox[4]);
|
||||||
typedef struct { int x, y; INT32 count; INT32 pixel; } ImagingColorItem;
|
typedef struct { int x, y; INT32 count; INT32 pixel; } ImagingColorItem;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user