23 FIMEMORY* hmem = FreeImage_OpenMemory((BYTE*)data, size);
24 if (hmem ==
nullptr) {
25 throw std::runtime_error(
"Could not open memory stream for image");
28 FREE_IMAGE_FORMAT fif = FreeImage_GetFileTypeFromMemory(hmem, 0);
29 if (fif == FIF_UNKNOWN) {
30 FreeImage_CloseMemory(hmem);
31 throw std::runtime_error(
"Unknown image format from memory");
34 FIBITMAP* dib = FreeImage_LoadFromMemory(fif, hmem, 0);
35 FreeImage_CloseMemory(hmem);
38 throw std::runtime_error(
"Failed to load image from memory");
41 FIBITMAP* dibConverted = FreeImage_ConvertTo32Bits(dib);
42 FreeImage_Unload(dib);
45 throw std::runtime_error(
"Failed to convert image to 32 bits");
49 imageData.
width = FreeImage_GetWidth(dibConverted);
50 imageData.
height = FreeImage_GetHeight(dibConverted);
53 unsigned int pitch = FreeImage_GetPitch(dibConverted);
54 imageData.
data.resize(imageData.
height * pitch);
56 FreeImage_ConvertToRawBits(imageData.
data.data(), dibConverted, pitch, 32,
57 FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, TRUE);
60 for (
unsigned int y = 0; y < imageData.
height; ++y) {
61 for (
unsigned int x = 0; x < imageData.
width; ++x) {
62 unsigned int offset = (y * pitch) + (x * 4);
63 std::swap(imageData.
data[offset], imageData.
data[offset + 2]);
67 FreeImage_Unload(dibConverted);
74 FREE_IMAGE_FORMAT fif = FreeImage_GetFileType(filename.c_str(), 0);
75 if (fif == FIF_UNKNOWN) {
76 fif = FreeImage_GetFIFFromFilename(filename.c_str());
79 if (fif == FIF_UNKNOWN) {
80 throw std::runtime_error(
"Unknown image format");
83 FIBITMAP* dib = FreeImage_Load(fif, filename.c_str());
85 throw std::runtime_error(
"Failed to load image");
88 FIBITMAP* dibConverted = FreeImage_ConvertTo32Bits(dib);
89 FreeImage_Unload(dib);
92 throw std::runtime_error(
"Failed to convert image to 32 bits");
96 imageData.
width = FreeImage_GetWidth(dibConverted);
97 imageData.
height = FreeImage_GetHeight(dibConverted);
100 unsigned int pitch = FreeImage_GetPitch(dibConverted);
101 imageData.
data.resize(imageData.
height * pitch);
103 FreeImage_ConvertToRawBits(imageData.
data.data(), dibConverted, pitch, 32,
104 FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, TRUE);
106 for (
unsigned int y = 0; y < imageData.
height; ++y) {
107 for (
unsigned int x = 0; x < imageData.
width; ++x) {
108 unsigned int offset = (y * pitch) + (x * 4);
109 std::swap(imageData.
data[offset], imageData.
data[offset + 2]);
114 FreeImage_Unload(dibConverted);
120 FIBITMAP* dib = FreeImage_AllocateT(FIT_BITMAP, imageData.
width, imageData.
height, 32);
125 unsigned int pitch = FreeImage_GetPitch(dib);
126 FreeImage_ConvertFromRawBits(
127 (BYTE*)imageData.
data.data(),
137 FREE_IMAGE_FORMAT fif = FreeImage_GetFIFFromFilename(filename.c_str());
138 bool success = FreeImage_Save(fif, dib, filename.c_str());
140 FreeImage_Unload(dib);