我正在开发一个项目,我有一个服务器,它将加密的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循环刷新显示。
感谢您的任何意见。
答案 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
。