]> gitweb.hhaalo.de Git - sane-kds-s2000w-net.git/commitdiff
add tiff read and write pbm wrong
authorBastian Dehn <hhaalo@arcor.de>
Sun, 26 Jan 2025 21:04:58 +0000 (22:04 +0100)
committerBastian Dehn <hhaalo@arcor.de>
Sun, 26 Jan 2025 21:04:58 +0000 (22:04 +0100)
src/kds_s2000w_image_converter_netpbm.c

index 0d67d4f4677cb9b2c43c4e9b8bf928fe208cbe9c..30e662d79f27b5d5d25f91af8cbff1e044c3f365 100644 (file)
@@ -286,4 +286,51 @@ void kds_s2000w_image_converter_tiff_to_pnm(blobdata* in, blobdata* out)
 
        if (!kds_s2000w_image_type_check_is_tiff(in))
                return;
+
+       FILE* tiff_stream = fmemopen(in->data, in->size, "r");
+       TIFF* tiff = TIFFClientOpen("input.tiff", "r", tiff_stream,
+               _kds_s2000w_image_converter_tiff_read,
+               _kds_s2000w_image_converter_tiff_write,
+               _kds_s2000w_image_converter_tiff_seek,
+               _kds_s2000w_image_converter_tiff_close,
+               _kds_s2000w_image_converter_tiff_size,
+               NULL, NULL);
+
+       int width = 0;
+       int height = 0;
+       TIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &width);
+       TIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &height);
+
+       bit** bits = malloc(sizeof(bit*) * height);
+       for (int i = 0; i < height; i++) {
+               bits[i] = malloc(sizeof(bit) * width);
+       }
+
+       unsigned char* rowbuf = malloc(sizeof(unsigned char) * width);
+       for (int i = 0; i < height; i++) {
+               TIFFReadScanline(tiff, bits[i], i, 0);
+       }
+       free(rowbuf);
+       rowbuf = NULL;
+
+       char** outdata = malloc(sizeof(char*));
+       FILE* pnm_stream = open_memstream(outdata, &out->size);
+       pbm_writepbm(pnm_stream, bits, width, height, 0);
+       fclose(pnm_stream);
+       pnm_stream = NULL;
+
+       out->data = malloc(sizeof(char) * out->size);
+       memcpy(out->data, *outdata, out->size);
+
+       free(*outdata);
+       *outdata = NULL;
+       free(outdata);
+       outdata = NULL;
+       TIFFClose(tiff);
+       for (int i = 0; i < height; i++) {
+               free(bits[i]);
+               bits[i] = NULL;
+       }
+       free(bits);
+       bits = NULL;
 }