23 FREE_IMAGE_FORMAT fif = FreeImage_GetFileType(filename.c_str(), 0);
24 if (fif == FIF_UNKNOWN) {
25 fif = FreeImage_GetFIFFromFilename(filename.c_str());
28 if (fif == FIF_UNKNOWN) {
29 throw std::runtime_error(
"Unknown image format");
32 FIBITMAP* dib = FreeImage_Load(fif, filename.c_str());
34 throw std::runtime_error(
"Failed to load image");
37 FIBITMAP* dibConverted = FreeImage_ConvertTo32Bits(dib);
38 FreeImage_Unload(dib);
41 throw std::runtime_error(
"Failed to convert image to 32 bits");
45 imageData.
width = FreeImage_GetWidth(dibConverted);
46 imageData.
height = FreeImage_GetHeight(dibConverted);
49 unsigned int pitch = FreeImage_GetPitch(dibConverted);
50 imageData.
data.resize(imageData.
height * pitch);
52 FreeImage_ConvertToRawBits(imageData.
data.data(), dibConverted, pitch, 32,
53 FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, TRUE);
55 for (
unsigned int y = 0; y < imageData.
height; ++y) {
56 for (
unsigned int x = 0; x < imageData.
width; ++x) {
57 unsigned int offset = (y * pitch) + (x * 4);
58 std::swap(imageData.
data[offset], imageData.
data[offset + 2]);
63 FreeImage_Unload(dibConverted);
69 FIBITMAP* dib = FreeImage_AllocateT(FIT_BITMAP, imageData.
width, imageData.
height, 32);
74 unsigned int pitch = FreeImage_GetPitch(dib);
75 FreeImage_ConvertFromRawBits(
76 (BYTE*)imageData.
data.data(),
86 FREE_IMAGE_FORMAT fif = FreeImage_GetFIFFromFilename(filename.c_str());
87 bool success = FreeImage_Save(fif, dib, filename.c_str());
89 FreeImage_Unload(dib);