mirror of
https://github.com/python/cpython.git
synced 2025-11-28 14:11:15 +00:00
Added method to write image files.
This commit is contained in:
parent
815adc9870
commit
3accf984b3
1 changed files with 68 additions and 0 deletions
|
|
@ -130,6 +130,7 @@ imgfile_read(self, args)
|
||||||
((bs[x] & 0xff)<<16);
|
((bs[x] & 0xff)<<16);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
iclose(image);
|
||||||
if ( error_called ) {
|
if ( error_called ) {
|
||||||
DECREF(rv);
|
DECREF(rv);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
@ -231,11 +232,78 @@ imgfile_getsizes(self, args)
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static object *
|
||||||
|
imgfile_write(self, args)
|
||||||
|
object *self;
|
||||||
|
object *args;
|
||||||
|
{
|
||||||
|
IMAGE *image;
|
||||||
|
char *fname;
|
||||||
|
int xsize, ysize, zsize, len;
|
||||||
|
char *cdatap;
|
||||||
|
long *idatap;
|
||||||
|
short rs[8192], gs[8192], bs[8192];
|
||||||
|
short r, g, b;
|
||||||
|
long rgb;
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
if ( !getargs(args, "(ss#iii)",
|
||||||
|
&fname, &cdatap, &len, &xsize, &ysize, &zsize) )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if ( zsize != 1 && zsize != 3 ) {
|
||||||
|
err_setstr(ImgfileError, "Can only handle 1 or 3 byte pixels");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if ( (zsize == 1 && len != xsize*ysize) ||
|
||||||
|
(zsize == 3 && len != xsize*ysize*4) ) {
|
||||||
|
err_setstr(ImgfileError, "Data does not match sizes");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Opening %s, %d %d %d\n", fname, xsize, ysize, zsize);
|
||||||
|
image =iopen(fname, "w", RLE(1), 3, xsize, ysize, zsize);
|
||||||
|
if ( image == 0 ) {
|
||||||
|
if ( ! error_called )
|
||||||
|
err_setstr(ImgfileError, "Cannot create image file");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
idatap = (long *)cdatap;
|
||||||
|
|
||||||
|
for( y=0; y<ysize && !error_called; y++ ) {
|
||||||
|
if ( zsize == 1 ) {
|
||||||
|
for( x=0; x<xsize; x++ )
|
||||||
|
rs[x] = *cdatap++;
|
||||||
|
putrow(image, rs, y, 0);
|
||||||
|
} else {
|
||||||
|
for( x=0; x<xsize; x++ ) {
|
||||||
|
rgb = *idatap++;
|
||||||
|
r = rgb & 0xff;
|
||||||
|
g = (rgb >> 8 ) & 0xff;
|
||||||
|
b = (rgb >> 16 ) & 0xff;
|
||||||
|
rs[x] = r;
|
||||||
|
gs[x] = g;
|
||||||
|
bs[x] = b;
|
||||||
|
}
|
||||||
|
putrow(image, rs, y, 0);
|
||||||
|
putrow(image, gs, y, 1);
|
||||||
|
putrow(image, bs, y, 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
iclose(image);
|
||||||
|
if ( error_called )
|
||||||
|
return 0;
|
||||||
|
INCREF(None);
|
||||||
|
return None;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static struct methodlist imgfile_methods[] = {
|
static struct methodlist imgfile_methods[] = {
|
||||||
{ "getsizes", imgfile_getsizes },
|
{ "getsizes", imgfile_getsizes },
|
||||||
{ "read", imgfile_read },
|
{ "read", imgfile_read },
|
||||||
{ "readscaled", imgfile_readscaled },
|
{ "readscaled", imgfile_readscaled },
|
||||||
|
{ "write", imgfile_write },
|
||||||
{ 0, 0 }
|
{ 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue