我需要帮助使用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;
}
答案 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);