2013-08-20 33 views
1

我需要加载图像并将其传递给代码。我试图修改这个library的部分代码。这个库是为windows设计的,下面是我需要为linux环境修改的代码。有人可以帮助我与其相当的Linux。如何从本地目录中以C++加载图像

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); 
+1

这不是C++它是C++/CLI不能在Linux上工作,除非有一些你可以使用的单声道魔法。 – doctorlove

+0

@doctorlove是的,它不会工作。我需要它的等同于Linux? – 2vision2

+2

Linux上有许多图像加载库可用。这两种类型都是针对单一图像类型(如用于PNG图像的libpng,用于JPEG图像的libjpeg等),然后使用这些特定库来加载多种格式的库。快速搜索应该找到你的东西。 –

回答

1

一个简单的解决方案是使用用于灰度或用于RGB PPM文件格式PGM文件格式,因为它们是从琐碎代码读取,然后使用ImageMagick做转换(Linux命令是例如convert myfile.jpg myfile.ppm)。 ImageMagick支持大量的文件格式,包括相当奇特的文件格式。

例如C代码,用于读取只使用一个<stdio.h> PPM文件是

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产生的那些文件不是不幸的)。