int imLoadMap(char *filename, unsigned char *map, long *palette) { int error; imFile* ifile = imFileOpen(filename, &error); if (!ifile) return error; int width, height, color_mode, data_type; error = imFileReadImageInfo(ifile, 0, &width, &height, &color_mode, &data_type); if (error) { imFileClose(ifile); return error; } if (imColorModeSpace(color_mode) != IM_MAP && imColorModeSpace(color_mode) != IM_GRAY && imColorModeSpace(color_mode) != IM_BINARY) return IM_ERR_DATA; if (iOldResolutionCB) { double xres = *(float*)imFileGetAttribute(ifile, "XResolution", NULL, NULL); double yres = *(float*)imFileGetAttribute(ifile, "YResolution", NULL, NULL); int res_unit = *(int*)imFileGetAttribute(ifile, "ResolutionUnit", NULL, NULL); iOldResolutionCB(filename, &xres, &yres, &res_unit); } if (iOldTiffImageDescCB) { char* img_desc = (char*)imFileGetAttribute(ifile, "Description", NULL, NULL); iOldTiffImageDescCB(filename, img_desc); } if (iOldGifTranspIndexCB) { unsigned char transp_index = *(unsigned char*)imFileGetAttribute(ifile, "TransparencyIndex", NULL, NULL); iOldGifTranspIndexCB(filename, &transp_index); } if (iOldCounterCB) imCounterSetCallback(filename, iOldFileCounter); error = imFileReadImageData(ifile, map, 1, 0); if (error) { imFileClose(ifile); return error; } int palette_count; imFileGetPalette(ifile, palette, &palette_count); imFileClose(ifile); return IM_ERR_NONE; }
static void iFileCheckConvertGray(imFile* ifile, imbyte* data) { int i, do_remap = 0; imbyte remap[256], r, g, b; // enforce the palette to only have grays in the correct order. for (i = 0; i < ifile->palette_count; i++) { imColorDecode(&r, &g, &b, ifile->palette[i]); if (r != i) { ifile->palette[i] = imColorEncode((imbyte)i, (imbyte)i, (imbyte)i); do_remap = 1; } remap[i] = r; } if (!do_remap) return; int count = ifile->width*ifile->height; for(i = 0; i < count; i++) { *data = remap[*data]; data++; } int transp_count; imbyte* transp_map = (imbyte*)imFileGetAttribute(ifile, "TransparencyMap", NULL, &transp_count); if (transp_map) { imbyte new_transp_map[256]; for (i=0; i<transp_count; i++) new_transp_map[i] = transp_map[remap[i]]; imFileSetAttribute(ifile, "TransparencyMap", IM_BYTE, transp_count, new_transp_map); } }
/*****************************************************************************\ file:GetAttribute(attrib) \*****************************************************************************/ static int imluaFileGetAttribute (lua_State *L) { int data_type; int i, count; const void *data; int as_string = 0; imFile *ifile = imlua_checkfile(L, 1); const char *attrib = luaL_checkstring(L, 2); data = imFileGetAttribute(ifile, attrib, &data_type, &count); if (!data) { lua_pushnil(L); return 1; } if (data_type == IM_BYTE && lua_isboolean(L, 3)) as_string = lua_toboolean(L, 3); if (!as_string) lua_newtable(L); switch (data_type) { case IM_BYTE: { if (as_string) { lua_pushstring(L, (const char*)data); } else { imbyte *data_byte = (imbyte*) data; for (i = 0; i < count; i++, data_byte++) { lua_pushnumber(L, *data_byte); lua_rawseti(L, -2, i+1); } } } break; case IM_SHORT: { short *data_short = (short*) data; for (i = 0; i < count; i++, data_short += 2) { lua_pushnumber(L, *data_short); lua_rawseti(L, -2, i+1); } } break; case IM_USHORT: { imushort *data_ushort = (imushort*) data; for (i = 0; i < count; i++, data_ushort += 2) { lua_pushnumber(L, *data_ushort); lua_rawseti(L, -2, i+1); } } break; case IM_INT: { int *data_int = (int*) data; for (i = 0; i < count; i++, data_int++) { lua_pushnumber(L, *data_int); lua_rawseti(L, -2, i+1); } } break; case IM_FLOAT: { float *data_float = (float*) data; for (i = 0; i < count; i++, data_float++) { lua_pushnumber(L, *data_float); lua_rawseti(L, -2, i+1); } } break; case IM_CFLOAT: { float *data_float = (float*) data; for (i = 0; i < count; i++, data_float += 2) { imlua_newarrayfloat(L, data_float, 2, 1); lua_rawseti(L, -2, i+1); } } break; case IM_DOUBLE: { double *data_double = (double*) data; for (i = 0; i < count; i++, data_double++) { lua_pushnumber(L, *data_double); lua_rawseti(L, -2, i+1); } } break; case IM_CDOUBLE: { double *data_double = (double*) data; for (i = 0; i < count; i++, data_double += 2) { imlua_newarraydouble(L, data_double, 2, 1); lua_rawseti(L, -2, i+1); } } break; } lua_pushinteger(L, data_type); return 2; }
int imLoadRGB(char *filename, unsigned char *red, unsigned char *green, unsigned char *blue) { int error; imFile* ifile = imFileOpen(filename, &error); if (!ifile) return error; int width, height, color_mode, data_type; error = imFileReadImageInfo(ifile, 0, &width, &height, &color_mode, &data_type); if (error) { imFileClose(ifile); return error; } if (iOldResolutionCB) { double xres = *(float*)imFileGetAttribute(ifile, "XResolution", NULL, NULL); double yres = *(float*)imFileGetAttribute(ifile, "YResolution", NULL, NULL); int res_unit = *(int*)imFileGetAttribute(ifile, "ResolutionUnit", NULL, NULL); iOldResolutionCB(filename, &xres, &yres, &res_unit); } if (iOldTiffImageDescCB) { char* img_desc = (char*)imFileGetAttribute(ifile, "Description", NULL, NULL); iOldTiffImageDescCB(filename, img_desc); } if (iOldGifTranspIndexCB) { unsigned char transp_index = *(unsigned char*)imFileGetAttribute(ifile, "TransparencyIndex", NULL, NULL); iOldGifTranspIndexCB(filename, &transp_index); } int count = width*height; void* data; if (green != red + count || blue != green + count) data = malloc(imImageDataSize(width, height, IM_RGB, IM_BYTE)); else data = red; if (!data) { imFileClose(ifile); return IM_ERR_MEM; } if (iOldCounterCB) imCounterSetCallback(filename, iOldFileCounter); error = imFileReadImageData(ifile, data, 1, 0); if (error) { if (data != red) free(data); imFileClose(ifile); return error; } if (imColorModeToBitmap(color_mode) != IM_RGB) { long palette[256]; int palette_count; imFileGetPalette(ifile, palette, &palette_count); iConvertMapToRGB((imbyte*)data, red, green, blue, count, palette, palette_count); } else if (data != red) { memcpy(red, data, count); memcpy(green, (unsigned char*)data+count, count); memcpy(blue, (unsigned char*)data+2*count, count); } imFileClose(ifile); if (data != red) free(data); return IM_ERR_NONE; }
void PrintImageInfo(const char* file_name) { printf("IM Info\n"); printf(" File Name:\n %s\n", file_name); int error; imFile* ifile = imFileOpen(file_name, &error); if (!ifile) { PrintError(error); return; } double file_size = FileSize(file_name); printf(" File Size: %.2f %s\n", file_size, GetSizeDesc(&file_size)); char format[10]; char compression[20]; int image_count; imFileGetInfo(ifile, format, compression, &image_count); char format_desc[50]; imFormatInfo(format, format_desc, NULL, NULL); printf(" Format: %s - %s\n", format, format_desc); printf(" Compression: %s\n", compression); printf(" Image Count: %d\n", image_count); for (int i = 0; i < image_count; i++) { int width, height, color_mode, data_type; error = imFileReadImageInfo(ifile, i, &width, &height, &color_mode, &data_type); if (error != IM_ERR_NONE) { PrintError(error); imFileClose(ifile); return; } printf(" Image #%d\n", i); printf(" Width: %d\n", width); printf(" Height: %d\n", height); printf(" Color Space: %s\n", imColorModeSpaceName(color_mode)); printf(" Has Alpha: %s\n", imColorModeHasAlpha(color_mode)? "Yes": "No"); printf(" Is Packed: %s\n", imColorModeIsPacked(color_mode)? "Yes": "No"); printf(" Is Top Down: %s\n", imColorModeIsTopDown(color_mode)? "Yes": "No"); printf(" Data Type: %s\n", imDataTypeName(data_type)); double image_size = imImageDataSize(width, height, color_mode, data_type); printf(" Data Size: %.2f %s\n", image_size, GetSizeDesc(&image_size)); char* attrib_list[50]; // should be dynamic allocated int attrib_list_count; imFileGetAttributeList(ifile, attrib_list, &attrib_list_count); for (int a = 0; a < attrib_list_count; a++) { if (a == 0) printf(" Attributes:\n"); int attrib_data_type, attrib_count; const void* attrib_data = imFileGetAttribute(ifile, attrib_list[a], &attrib_data_type, &attrib_count); if (attrib_count == 1) printf(" %s: %s\n", attrib_list[a], AttribData2Str(attrib_data, attrib_data_type)); else if (attrib_data_type == IM_BYTE && FindZero((imbyte*)attrib_data, attrib_count)) printf(" %s: %s\n", attrib_list[a], attrib_data); else printf(" %s: %s %s ...\n", attrib_list[a], AttribData2Str(attrib_data, attrib_data_type), AttribData2Str((imbyte*)attrib_data + imDataTypeSize(attrib_data_type), attrib_data_type)); } } imFileClose(ifile); }