fclose(jpeg_stream);
}
+void _kds_s2000w_image_color_jpg_to_pnm(j_decompress_ptr cinfo,
+ FILE* jpeg_stream,
+ FILE* pnm_stream)
+{
+ size_t decompress_size = RGB * cinfo->output_width * cinfo->output_height;
+ unsigned char* decompress_data = malloc(sizeof(unsigned char) * decompress_size);
+
+ unsigned char* row = NULL;
+ while (cinfo->output_scanline < cinfo->output_height) {
+ row = &decompress_data[cinfo->output_width * cinfo->output_scanline * RGB];
+ jpeg_read_scanlines(cinfo, &row, 1);
+ }
+ fclose(jpeg_stream);
+
+ xel** pixels = malloc(sizeof(xel*) * cinfo->output_height);
+ for (int i = 0; i < cinfo->output_height; i++) {
+ pixels[i] = malloc(sizeof(xel) * cinfo->output_width);
+ }
+
+ int currwidth = 0;
+ int currheight = 0;
+ for (int i = 0; i < decompress_size; i += RGB) {
+ pixels[currheight][currwidth].r = decompress_data[i];
+ pixels[currheight][currwidth].g = decompress_data[i + 1];
+ pixels[currheight][currwidth].b = decompress_data[i + 2];
+ currwidth++;
+ if (currwidth >= cinfo->output_width) {
+ currwidth = 0;
+ currheight++;
+ }
+ }
+
+ pnm_writepnm(pnm_stream, pixels, cinfo->output_width, cinfo->output_height, PNM_MAXMAXVAL, PPM_FORMAT, 0);
+
+ for (int i = 0; i < cinfo->output_height; i++) {
+ free(pixels[i]);
+ pixels[i] = NULL;
+ }
+ free(pixels);
+ pixels = NULL;
+ free(decompress_data);
+ decompress_data = NULL;
+}
+
+void _kds_s2000w_image_gray_jpg_to_pnm(j_decompress_ptr cinfo,
+ FILE* jpeg_stream,
+ FILE* pnm_stream)
+{
+ size_t decompress_size = GRAY * cinfo->output_width * cinfo->output_height;
+ unsigned char* decompress_data = malloc(sizeof(unsigned char) * decompress_size);
+
+ unsigned char* row = NULL;
+ while (cinfo->output_scanline < cinfo->output_height) {
+ row = &decompress_data[cinfo->output_width * cinfo->output_scanline * GRAY];
+ jpeg_read_scanlines(cinfo, &row, 1);
+ }
+ fclose(jpeg_stream);
+
+ gray** pixels = malloc(sizeof(gray*) * cinfo->output_height);
+ for (int i = 0; i < cinfo->output_height; i++) {
+ pixels[i] = malloc(sizeof(gray) * cinfo->output_width);
+ }
+
+ int currwidth = 0;
+ int currheight = 0;
+ for (int i = 0; i < decompress_size; i += GRAY) {
+ pixels[currheight][currwidth] = decompress_data[i];
+ currwidth++;
+ if (currwidth >= cinfo->output_width) {
+ currwidth = 0;
+ currheight++;
+ }
+ }
+
+ pgm_writepgm(pnm_stream, pixels, cinfo->output_width, cinfo->output_height, PNM_MAXMAXVAL, 0);
+
+ for (int i = 0; i < cinfo->output_height; i++) {
+ free(pixels[i]);
+ pixels[i] = NULL;
+ }
+ free(pixels);
+ pixels = NULL;
+ free(decompress_data);
+ decompress_data = NULL;
+}
+
void kds_s2000w_image_converter_metadata_from_scanner_image(blobdata* image, image_metadata* mdata)
{
if (image->size < 2)
jpeg_read_header(&cinfo, TRUE);
jpeg_start_decompress(&cinfo);
- if (cinfo.out_color_space == JCS_RGB) {
- size_t decompress_size = RGB * cinfo.output_width * cinfo.output_height;
- unsigned char* decompress_data = malloc(sizeof(unsigned char) * decompress_size);
-
- unsigned char* row = NULL;
- while (cinfo.output_scanline < cinfo.output_height) {
- row = &decompress_data[cinfo.output_width * cinfo.output_scanline * RGB];
- jpeg_read_scanlines(&cinfo, &row, 1);
- }
- fclose(jpeg_stream);
-
- xel** pixels = malloc(sizeof(xel*) * cinfo.output_height);
- for (int i = 0; i < cinfo.output_height; i++) {
- pixels[i] = malloc(sizeof(xel) * cinfo.output_width);
- }
+ char** outdata = malloc(sizeof(char*));
+ FILE* pnm_stream = open_memstream(outdata, &out->size);
- int currwidth = 0;
- int currheight = 0;
- for (int i = 0; i < decompress_size; i += RGB) {
- pixels[currheight][currwidth].r = decompress_data[i];
- pixels[currheight][currwidth].g = decompress_data[i + 1];
- pixels[currheight][currwidth].b = decompress_data[i + 2];
- currwidth++;
- if (currwidth >= cinfo.output_width) {
- currwidth = 0;
- currheight++;
- }
- }
+ if (cinfo.out_color_space == JCS_RGB)
+ _kds_s2000w_image_color_jpg_to_pnm(&cinfo, jpeg_stream, pnm_stream);
- char** outdata = malloc(sizeof(char*));
- FILE* pnm_stream = open_memstream(outdata, &out->size);
- pnm_writepnm(pnm_stream, pixels, cinfo.output_width, cinfo.output_height, PNM_MAXMAXVAL, PPM_FORMAT, 0);
- fclose(pnm_stream);
- out->data = malloc(sizeof(char) * out->size);
- memcpy(out->data, *outdata, out->size);
- free(*outdata);
- *outdata = NULL;
- free(outdata);
- outdata = NULL;
-
- for (int i = 0; i < cinfo.output_height; i++) {
- free(pixels[i]);
- pixels[i] = NULL;
- }
- free(pixels);
- pixels = NULL;
+ if (cinfo.out_color_space == JCS_GRAYSCALE)
+ _kds_s2000w_image_gray_jpg_to_pnm(&cinfo, jpeg_stream, pnm_stream);
- free(decompress_data);
- decompress_data = NULL;
- }
-
- if (cinfo.out_color_space == JCS_GRAYSCALE) {
- size_t decompress_size = GRAY * cinfo.output_width * cinfo.output_height;
- unsigned char* decompress_data = malloc(sizeof(unsigned char) * decompress_size);
-
- unsigned char* row = NULL;
- while (cinfo.output_scanline < cinfo.output_height) {
- row = &decompress_data[cinfo.output_width * cinfo.output_scanline * GRAY];
- jpeg_read_scanlines(&cinfo, &row, 1);
- }
- fclose(jpeg_stream);
-
- gray** pixels = malloc(sizeof(gray*) * cinfo.output_height);
- for (int i = 0; i < cinfo.output_height; i++) {
- pixels[i] = malloc(sizeof(gray) * cinfo.output_width);
- }
-
- int currwidth = 0;
- int currheight = 0;
- for (int i = 0; i < decompress_size; i += GRAY) {
- pixels[currheight][currwidth] = decompress_data[i];
- currwidth++;
- if (currwidth >= cinfo.output_width) {
- currwidth = 0;
- currheight++;
- }
- }
-
- char** outdata = malloc(sizeof(char*));
- FILE* pnm_stream = open_memstream(outdata, &out->size);
- pgm_writepgm(pnm_stream, pixels, cinfo.output_width, cinfo.output_height, PNM_MAXMAXVAL, 0);
- fclose(pnm_stream);
- out->data = malloc(sizeof(char) * out->size);
- memcpy(out->data, *outdata, out->size);
- free(*outdata);
- *outdata = NULL;
- free(outdata);
- outdata = NULL;
-
- for (int i = 0; i < cinfo.output_height; i++) {
- free(pixels[i]);
- pixels[i] = NULL;
- }
- free(pixels);
- pixels = NULL;
-
- free(decompress_data);
- decompress_data = NULL;
- }
+ fclose(pnm_stream);
+ out->data = malloc(sizeof(char) * out->size);
+ memcpy(out->data, *outdata, out->size);
+ free(*outdata);
+ *outdata = NULL;
+ free(outdata);
+ outdata = NULL;
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);