1

我需要加载图像并将其传递给代码。我正在尝试修改此中的部分代码。这个库是为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);
4

2 回答 2

1

FreeImage 不错: http: //freeimage.sourceforge.net;但我一直更喜欢 OpenCV 来处理每个图像处理的东西: http: //opencv.org

两者都是跨平台的。

于 2013-08-20T14:16:32.347 回答
1

一个简单的解决方案是使用PGM灰度文件格式或PPMRGB 文件格式,因为它们很容易从代码中读取,然后使用ImageMagick进行转换(例如 linux 命令convert myfile.jpg myfile.ppm)。ImageMagick 支持大量文件格式,包括相当奇特的文件格式。

例如,用于读取 PPM 文件的 C 代码仅使用<stdio.h>is

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,不幸的是,生成的文件不是)。

于 2013-08-20T14:51:43.440 回答