用C+编写PNG+; 我试图在Windows 7 64位上使用Visual Studio Express 2013用C++编写PNG文件的一些数据。我知道要做到这一点,我需要使用一个外部库,但这里是我遇到一些困难的地方

用C+编写PNG+; 我试图在Windows 7 64位上使用Visual Studio Express 2013用C++编写PNG文件的一些数据。我知道要做到这一点,我需要使用一个外部库,但这里是我遇到一些困难的地方,c++,png,libpng,C++,Png,Libpng,我试着使用LodePNG——它看起来简单、轻巧、易于使用。问题是,它太简单了,而且似乎需要某种像素格式的数据,而这种格式与我现有的不匹配。我可以修改我的数据,使其与LodePNG兼容,但我更愿意使用像libpng这样的库,具有更大的灵活性 然而,我不理解构建或链接库的第一件事,事实证明libpng在这方面绝对是一场噩梦。我尝试了以下内容,并成功地生成了“libpng.lib”和“png.h”,但当我尝试将它们包含在我的项目中时(我将这两个文件都放在我的项目目录中,将“png.h”添加到头文件中,

我试着使用LodePNG——它看起来简单、轻巧、易于使用。问题是,它太简单了,而且似乎需要某种像素格式的数据,而这种格式与我现有的不匹配。我可以修改我的数据,使其与LodePNG兼容,但我更愿意使用像libpng这样的库,具有更大的灵活性

然而,我不理解构建或链接库的第一件事,事实证明libpng在这方面绝对是一场噩梦。我尝试了以下内容,并成功地生成了“libpng.lib”和“png.h”,但当我尝试将它们包含在我的项目中时(我将这两个文件都放在我的项目目录中,将“png.h”添加到头文件中,并将“libpng.lib”添加到链接器的“附加依赖项”字段中),我遇到了大量的构建错误,尤其是:

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

有谁能告诉我如何安装libpng,给我一个关于这个主题的好指南(我很惊讶没有指南…),或者推荐一个不同的(轻量级的,易于安装的)PNG库?我快疯了。

缺少的头文件可能是因为您需要指定addition include目录,以及指向libpng的头文件。看起来您可能链接正确


我已经有一段时间没有在visual Studio中这样做了,但是在项目配置中应该有一个字段

考虑按指定的NetPBM/PBMplus格式编写文件。这非常简单,而且您不需要库,因为文件非常简单。维基百科的文章显示了格式

下面是一个简单的例子:

#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);
}

洛德平就像你说的那么简单。我以前也用过。以防您改变主意,决定将您拥有的数据编码为正确的格式(假设它是
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");
std::vector PngBuffer(ImageData.size()); 对于(std::int32_t I=0;I您真的,真的不想直接使用libpng。试试免费图像,它很容易使用。您可能想看看
ImageMagick
,也许它已经有了您想要做的功能。您可以从libpng源代码中的scripts dir获取pnglibconf.h。名为pnglibconf.h.在那里预建。谢谢,我会看看FreeImage、ImageMagick和GDI+@Ivarpois我相信我试过了,它抱怨另一个文件(可能是pngconf.h)Ivarpois:Thanx指出了这一点!!这对我来说是正确的答案!奇怪的是,lodepng文档没有提到这一点。它给人的印象是,它可以加载任何支持png的格式。
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");