使用C

时间:2016-02-17 19:13:03

标签: c linux image-processing

我正在开发一个项目,我有一个服务器,它将加密的jpeg发送到客户端然后解密它。目前,在将图像写入当前目录之前,图像存储在接收器端的字节数组中。

void decryptionFunction(){

    uint8 *plaintext; /* Pointer to buffer that contains decrypted jpeg 
                       data*/
    uint32 plaintext_len;
    int k = 0;
    while(1){
        /*Decryption happens here... malloc() buffer and set *plaintext 
         equal to it*/

        char buffer[32];
        snprintf(buffer, sizeof(char) *32 "file%i.jpeg", k);
        FILE *fp;
        fp = fopen(buffer, "wb");
        fwrite(plaintext, 1, plaintext_len, fp);
        fclose(fp);
        k++;
        free(plaintext);
    }
}

每次while循环完成时,新图像都会放入缓冲区,然后将图像写入当前目录。这一切都很好,但我想以某种方式显示图像,而不是将其写入当前目录。有没有办法在C中这样做?我目前已经考虑过使用某种协议将它从接收器流式传输到VLC,但这似乎比我想要的要复杂一些。

理想情况下,我想只显示缓冲区中的图像,每次通过while循环刷新显示。

感谢您的任何意见。

3 个答案:

答案 0 :(得分:1)

有许多不同的库可以显示图像。一个简单/简单是NxV。您也可以使用QT。

答案 1 :(得分:1)

我找到了一个现在可以使用的解决方案。我决定使用已弃用C函数的OpenCV库来处理图像显示。

void decryptionFunction(){

uint8 *plaintext; /* Pointer to buffer that contains decrypted jpeg 
                   data*/
uint32 plaintext_len;
int k = 0;
while(1){
    /*Decryption happens here... malloc() buffer and set *plaintext 
     equal to it*/

    CvMat matbox = cvMat(240, 320, CV_8UC1, plaintext);
    IplImage *img;
    img = cvDecodeImage(&matbox, 1);
    cvNamedWindow("test", CV_WINDOW_AUTOSIZE);
    cvShowImage("test", img);
    cvWaitKey(100);
    cvReleaseImage(&img);
    free(plaintext);
    }
}

虽然这些功能已被弃用,并且可以随时删除,但目前它们正是我想要的。缓冲区包含压缩的jpeg数据,为了使其显示在窗口中,必须将其解码为原始格式。我仍然在寻找一个可以完全不被弃用的C实现。

答案 2 :(得分:0)

您可以使用display程序,该程序是大多数Linux发行版上安装的ImageMagick套件的一部分,也可用于OSX和Windows。

基本上,在命令行中,您可以:

display image.png

它显示图像。它可以显示PNG,JPEG,TIFF和大约150种其他格式。如果您的图像发生了变化,或者您想要显示不同的图像,您可以执行以下操作,它将查找display的第一个实例并告诉它使用新图像刷新:

display -remote image2.jpg

只要您告诉它来自哪种类型的文件,它也可以从其stdin获取图像,因此它可以像这样工作:

cat image.jpg | display jpg:-

因此,您可以有效地使用popen()启动display,然后将图片缓冲区发送到stdin,然后,当您的图片发生变化时,再次使用添加的{{1}再次运行}}参数使其查找第一个显示的图像并刷新它而不是打开另一个显示。

有很多选项可以在显示前调整图像大小,将其覆盖在纯色背景或纹理上等等,如果您运行-remote