// transparent read method to load ldr image to dt_raw_image_t with exif and so on. dt_imageio_retval_t dt_imageio_open_ldr( dt_image_t *img, const char *filename, dt_mipmap_cache_allocator_t a) { dt_imageio_retval_t ret; ret = dt_imageio_open_tiff(img, filename, a); if(ret == DT_IMAGEIO_OK || ret == DT_IMAGEIO_CACHE_FULL) { img->filters = 0; img->flags &= ~DT_IMAGE_RAW; img->flags &= ~DT_IMAGE_HDR; img->flags |= DT_IMAGE_LDR; return ret; } // jpeg stuff here: if(!img->exif_inited) (void) dt_exif_read(img, filename); const int orientation = dt_image_orientation(img); dt_imageio_jpeg_t jpg; if(dt_imageio_jpeg_read_header(filename, &jpg)) return DT_IMAGEIO_FILE_CORRUPTED; img->width = (orientation & 4) ? jpg.height : jpg.width; img->height = (orientation & 4) ? jpg.width : jpg.height; uint8_t *tmp = (uint8_t *)malloc(sizeof(uint8_t)*jpg.width*jpg.height*4); if(dt_imageio_jpeg_read(&jpg, tmp)) { free(tmp); return DT_IMAGEIO_FILE_CORRUPTED; } img->bpp = 4*sizeof(float); void *buf = dt_mipmap_cache_alloc(img, DT_MIPMAP_FULL, a); if(!buf) { free(tmp); return DT_IMAGEIO_CACHE_FULL; } dt_imageio_flip_buffers_ui8_to_float((float *)buf, tmp, 0.0f, 255.0f, 4, jpg.width, jpg.height, jpg.width, jpg.height, 4*jpg.width, orientation); free(tmp); img->filters = 0; img->flags &= ~DT_IMAGE_RAW; img->flags &= ~DT_IMAGE_HDR; img->flags |= DT_IMAGE_LDR; return DT_IMAGEIO_OK; }
dt_imageio_retval_t dt_imageio_open_jpeg(dt_image_t *img, const char *filename, dt_mipmap_cache_allocator_t a) { const char *ext = filename + strlen(filename); while(*ext != '.' && ext > filename) ext--; if(strncmp(ext, ".jpg", 4) && strncmp(ext, ".JPG", 4) && strncmp(ext, ".jpeg", 5) && strncmp(ext, ".JPEG", 5)) return DT_IMAGEIO_FILE_CORRUPTED; if(!img->exif_inited) (void) dt_exif_read(img, filename); const int orientation = dt_image_orientation(img); dt_imageio_jpeg_t jpg; if(dt_imageio_jpeg_read_header(filename, &jpg)) return DT_IMAGEIO_FILE_CORRUPTED; img->width = (orientation & 4) ? jpg.height : jpg.width; img->height = (orientation & 4) ? jpg.width : jpg.height; uint8_t *tmp = (uint8_t *)malloc(sizeof(uint8_t)*jpg.width*jpg.height*4); if(dt_imageio_jpeg_read(&jpg, tmp)) { free(tmp); return DT_IMAGEIO_FILE_CORRUPTED; } img->bpp = 4*sizeof(float); void *buf = dt_mipmap_cache_alloc(img, DT_MIPMAP_FULL, a); if(!buf) { free(tmp); return DT_IMAGEIO_CACHE_FULL; } dt_imageio_flip_buffers_ui8_to_float((float *)buf, tmp, 0.0f, 255.0f, 4, jpg.width, jpg.height, jpg.width, jpg.height, 4*jpg.width, orientation); free(tmp); return DT_IMAGEIO_OK; }