mirror of
https://github.com/python/cpython.git
synced 2025-11-25 21:11:09 +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);
|
||||
}
|
||||
}
|
||||
iclose(image);
|
||||
if ( error_called ) {
|
||||
DECREF(rv);
|
||||
return NULL;
|
||||
|
|
@ -231,11 +232,78 @@ imgfile_getsizes(self, args)
|
|||
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[] = {
|
||||
{ "getsizes", imgfile_getsizes },
|
||||
{ "read", imgfile_read },
|
||||
{ "readscaled", imgfile_readscaled },
|
||||
{ "write", imgfile_write },
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue