用C ++编写PNG

时间:2014-03-22 17:09:48

标签: c++ png libpng

我正在尝试使用C ++和Windows 7 64位上的Visual Studio Express 2013将一些数据写入PNG文件。我明白要做到这一点,我需要使用一个外部库,但这里我遇到了一些困难。

我尝试使用LodePNG - 它看起来简单,轻便且易于使用。问题是,它很简单,并且似乎需要某种像素格式的数据与我所拥有的不匹配。我可以修改我的数据以使其与LodePNG兼容,但我更倾向于使用像libpng这样的库,而且更灵活。

但是,我不了解构建或链接库的第一件事,而libpng已经证明是一个绝对的噩梦。我尝试跟随this guide,并设法生成“libpng.lib”和“png.h”,但是当我尝试将这些文件包含在我的项目中时(我将这两个文件放在我的项目目录中,添加了“png.h”) “对于我的头文件并将”libpng.lib“添加到链接器的”附加依赖关系“字段中),我收到了大量的构建错误,特别是:

error C1083: Cannot open include file: 'pnglibconf.h': No such file or directory

任何人都可以请教我如何安装libpng,指导我一个关于这个主题的好指南(我对那里缺乏指南感到惊讶......),或推荐一个不同的(轻量级,易于安装)PNG库?我在这里疯了。

3 个答案:

答案 0 :(得分:5)

LodePNG就像你说的一样容易。我之前也使用过它。万一你改变主意并决定将你拥有的数据编码为正确的格式(假设它是BGRA)..以下将根据lodepng的要求将BGRA格式转换为RGBA ..

std::vector<std::uint8_t> PngBuffer(ImageData.size());

for(std::int32_t I = 0; I < Height; ++I)
{
    for(std::int32_t J = 0; J < Width; ++J)
    {
        std::size_t OldPos = (Height - I - 1) * (Width * 4) + 4 * J;
        std::size_t NewPos = I * (Width * 4) + 4 * J;
        PngBuffer[NewPos + 0] = ImageData[OldPos + 2]; //B is offset 2
        PngBuffer[NewPos + 1] = ImageData[OldPos + 1]; //G is offset 1
        PngBuffer[NewPos + 2] = ImageData[OldPos + 0]; //R is offset 0
        PngBuffer[NewPos + 3] = ImageData[OldPos + 3]; //A is offset 3
    }
}

std::vector<std::uint8_t> ImageBuffer;
lodepng::encode(ImageBuffer, PngBuffer, Width, Height);
lodepng::save_file(ImageBuffer, "SomeImage.png");

答案 1 :(得分:4)

考虑按照指定的here以NetPBM / PBMp​​lus格式编写文件。它非常简单,您不需要库,因为文件非常简单。维基百科文章显示格式here

这是一个简单的例子:

#include <stdio.h>
#include <stdlib.h>

int main(){

   FILE *imageFile;
   int x,y,pixel,height=100,width=256;

   imageFile=fopen("image.pgm","wb");
   if(imageFile==NULL){
      perror("ERROR: Cannot open output file");
      exit(EXIT_FAILURE);
   }

   fprintf(imageFile,"P5\n");           // P5 filetype
   fprintf(imageFile,"%d %d\n",width,height);   // dimensions
   fprintf(imageFile,"255\n");          // Max pixel

   /* Now write a greyscale ramp */
   for(x=0;x<height;x++){
      for(y=0;y<width;y++){
         pixel=y;
         fputc(pixel,imageFile);
      }
   }

   fclose(imageFile);
}

将文件作为PBM / PGM frmat后,使用ImageMagick(here)通过以下简单命令转换为PNG:

convert file.pgm file.png

答案 2 :(得分:0)

缺少的头文件可能是因为您需要指定添加包含目录以指向libpng的头文件。看起来你可能正确链接。

我已经在视觉工作室完成了这段时间,但在项目配置中应该有一个字段。