]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Added method to write image files.
authorJack Jansen <jack.jansen@cwi.nl>
Thu, 20 Aug 1992 11:54:27 +0000 (11:54 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Thu, 20 Aug 1992 11:54:27 +0000 (11:54 +0000)
Modules/imgfile.c

index 19ce5179008de4f9f3854240e82953539a43ae76..60026bbfa04c719095d3246e2f8dcf81975ea10b 100644 (file)
@@ -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 }
 };