我需要加载并将图像传递给代码。我正在尝试修改此library的部分代码。这个库是为windows设计的,下面是我需要为linux环境修改的代码。有人可以帮助我使用它的linux等价物。
System::Drawing::Bitmap^ m_bmpImage;
System::String^ sFile = gcnew System::String(txtFilePath->Text);
m_bmpImage = gcnew System::Drawing::Bitmap(sFile);
BitmapData^ bmpData = m_bmpImage->LockBits(
System::Drawing::Rectangle(0, 0, m_bmpImage->Width, m_bmpImage->Height),
ImageLockMode::ReadWrite, PixelFormat::Format24bppRgb);
ImageData imgData;
imgData.Resize(bmpData->Width, bmpData->Height, 3, bmpData->Stride);
memcpy(imgData.Data, (char*)(void*)bmpData->Scan0, bmpData->Stride*bmpData->Height);
m_bmpImage->UnlockBits(bmpData);
答案 0 :(得分:1)
FreeImage很好:http://freeimage.sourceforge.net; 但我总是更喜欢OpenCV用于每个图像处理:http://opencv.org
两者都是跨平台的。
答案 1 :(得分:1)
一个简单的解决方案是将PGM
文件格式用于RGB的灰度或PPM
文件格式,因为从代码中读取它们是微不足道的,然后使用ImageMagick进行转换( linux命令例如是convert myfile.jpg myfile.ppm
)。 ImageMagick支持大量的文件格式,包括非常奇特的文件格式。
例如,使用<stdio.h>
读取PPM文件的C代码是
FILE *f = fopen("filename.ppm", "rb");
if (f != NULL && fscanf(f, "P6 %i %i 255%*c", &w, &h) == 2) {
unsigned char *pixels = malloc(w*h*3);
if (!pixels) {
printf("Out of memory\n");
exit(1);
}
if (((int)fread(pixels, 1, w*h*3, f)) == w*h*3) {
fclose(f);
printf("Image is %i x %i pixels\n", w, h);
... process image ...
} else {
printf("Image file truncated\n");
exit(1);
}
} else {
printf("Invalid image file\n");
exit(1);
}
PGM(灰度)与P5
相同而不是P6
,每个像素只有一个字节而不是3个。
请注意,正式的PPM / PGM文件读起来有点烦人(例如标题中可能有注释)但convert
生成的文件是干净的(例如gimp
生成的那些是不幸的是,不是。)