如何从本地目录加载C ++中的图像

时间:2013-08-20 12:17:27

标签: c++ c windows unix

我需要加载并将图像传递给代码。我正在尝试修改此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);

2 个答案:

答案 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生成的那些是不幸的是,不是。)