将原始mono8数据转换为PNG时加速PNG ++

时间:2014-04-28 17:33:21

标签: c++ image arm libpng

我需要帮助使用PNG ++来执行相机缓冲区图像(原始mono8数据)到png压缩文件的优化转换。以下是有效的,但速度太慢了。我将在ARM中执行它。我需要一个非常快速的过程。

    sprintf(mBuffer, "%lu.png", pFrame->FrameCount);
    try
    {
        //Take the image from my camera buffer and put it into  vector i can 
        //work with 
        images = (const unsigned char*)pFrame->ImageBuffer;

        //create the png profile to be used
        png::image< png::gray_pixel > image(1024,1024); 

        //Take every byte from the vector and put in the determined position on 
        //the image matrix
        for(int i=0;i<1024;i++)
        {
            for(int j=0;j<1024;j++)
            {
                png::gray_pixel pix = images[i*1024+j];
                        image[i][j] = pix;
            }
        }

            image.write(mBuffer);
    }
    catch (std::exception const& error)
        {
            std::cerr << "Teste: " << error.what() << std::endl;

    }

1 个答案:

答案 0 :(得分:0)

这可能会或可能没有帮助 - 这只是一个建议。如果帧缓冲是8位无符号像素的顺序加载,那么格式与P5类型的NetPBM Portable Greymap(PGM)格式完全相同,后者记录为here。这可以非常快速地编写,可以直接在网页中使用,也可以使用ImageMagick(here)轻松转换为png,如下所示:

convert image.pgm image.png

然后你的图像写作可能很简单:

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

#define HEIGHT  100
#define WIDTH   256

int main(){

   FILE *imageFile;
   uint8_t image[HEIGHT][WIDTH];
   int x,y,pixel;

   /* Create a greyscale ramp - you don't need this, you would use your framebuffer */
   for(x=0;x<HEIGHT;x++){
      for(y=0;y<WIDTH;y++){
         image[x][y]=y;
      }
   }

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

   /* You could coalesce the next 3 lines into a single fprintf() if you wanted */
   fprintf(imageFile,"P5\n");           // P5 filetype
   fprintf(imageFile,"%d %d\n",WIDTH,HEIGHT);   // dimensions
   fprintf(imageFile,"255\n");          // Max pixel

   fwrite(image,HEIGHT,WIDTH,imageFile);

   fclose(imageFile);
}

根据您实际想要对图像执行的操作,您可以在完成高速采集运行时批量转换它们,或者稍后在后台转换它们,或者在其他机器上完全转换它们。 / p>

在我的例子中,我创建了图像,但是你已经在帧缓冲区中拥有了你的图像,所以你的图像写入将成为:

imageFile=fopen("image.pgm","wb");
fprintf(imageFile,"P5\n%d %d\n255\n",WIDTH,HEIGHT);
fwrite(images,HEIGHT,WIDTH,imageFile);
close(imageFile);