我有一段C++/Qt代码,其中我希望使用FreeImage库(http://freeimage.sourceforge.net/)加载图像,并将最终结果存储在QImage中。我知道Qt可以直接加载一些图像格式,但是我希望能够加载一些Qt不直接支持的格式.我试过各种方法让它起作用,但没有一种有效。
在我展示一些失败的尝试之前,这是函数的其余部分,它们都是相同的。下面的代码片段只是复制和粘贴到这个函数中:
QImage load(QString filename) {
FREE_IMAGE_FORMAT fif = FreeImage_GetFileType(filename.toStdString().c_str(), 0);
if(fif == FIF_UNKNOWN)
fif = FreeImage_GetFIFFromFilename(filename.toStdString().c_str());
if(fif == FIF_UNKNOWN)
return QImage();
FIBITMAP *dib = nullptr;
if(FreeImage_FIFSupportsReading(fif)) {
dib = FreeImage_Load(fif, filename.toStdString().c_str());
if(dib == nullptr)
return QImage();
} else
return QImage();
.... [conversion code comes here] ....
}我的前两次尝试是非常相似的。第一个尝试将图像加载到QImage中:
int width = FreeImage_GetWidth(dib);
int height = FreeImage_GetHeight(dib);
int bpp = FreeImage_GetBPP(dib);
int size = width * height * (bpp / 8);
BYTE *pixels = FreeImage_GetBits(dib);
QImage img;
img = img.fromData(pixels, size);
return img;第二种方法大致相同,但使用QPixmap:
int width = FreeImage_GetWidth(dib);
int height = FreeImage_GetHeight(dib);
int bits = FreeImage_GetBPP(dib);
int size = width * height * (bits / 8);
BYTE *pixels = FreeImage_GetBits(dib);
QPixmap pix;
pix.loadFromData(pixels,size);
return pix.toImage();我的第三次尝试是尝试让FreeImage将图像保存为JPEG格式的内存,然后在构造图像之前将其加载到QByteArray中:
FIMEMORY *stream = FreeImage_OpenMemory();
FreeImage_SaveToMemory(FIF_JPEG, dib, stream);
FreeImage_Unload(dib);
long size = FreeImage_TellMemory(stream);
QByteArray array = QByteArray::fromRawData((char*)stream->data, size);
QImage img;
img.loadFromData(array);
return img;这些尝试都不起作用。我检查了它是否在早期失败,但它直到获得空图像时才返回任何错误。但是,我不确定我是否在用正确的方式思考.有人有什么想法/暗示我可以尝试吗?
发布于 2018-03-06 22:14:50
好吧,我最终自己解决了这个问题
该解决方案有点类似于我上次的尝试,它涉及将加载的映像保存到内存中(在确保它是24位映像之后)和“获取”内存(仍然使用FreeImage),然后可以将其加载到QByteArray中,以便由QImage读取:
QImage load(QString filename) {
// Get image format
FREE_IMAGE_FORMAT fif = FreeImage_GetFileType(filename.toStdString().c_str(), 0);
if(fif == FIF_UNKNOWN)
fif = FreeImage_GetFIFFromFilename(filename.toStdString().c_str());
if(fif == FIF_UNKNOWN)
return QImage();
// Load image if possible
FIBITMAP *dib = nullptr;
if(FreeImage_FIFSupportsReading(fif)) {
dib = FreeImage_Load(fif, filename.toStdString().c_str());
if(dib == nullptr)
return QImage();
} else
return QImage();
// Convert to 24bits and save to memory as JPEG
FIMEMORY *stream = FreeImage_OpenMemory();
// FreeImage can only save 24-bit highcolor or 8-bit greyscale/palette bitmaps as JPEG
dib = FreeImage_ConvertTo24Bits(dib);
FreeImage_SaveToMemory(FIF_JPEG, dib, stream);
// Free memory
FreeImage_Unload(dib);
// Load JPEG data
BYTE *mem_buffer = nullptr;
DWORD size_in_bytes = 0;
FreeImage_AcquireMemory(stream, &mem_buffer, &size_in_bytes);
// Load raw data into QImage and return
QByteArray array = QByteArray::fromRawData((char*)mem_buffer, size_in_bytes);
return QImage::fromData(array);
}https://stackoverflow.com/questions/49137081
复制相似问题