我正在尝试打印由cURL返回的动态下载图像,如下所示:
char *raw_image = malloc(1024);
raw_image = doCurl("GET", img_url, NULL, NULL);
printf("Content-Type: image/png\n\n");
fwrite(raw_image, sizeof(raw_image), 20000, stdout);
如果我的尺寸小于20000 - 图像会被切断。我怎样才能使这个数字变得动态?我不想写一个文件 - 标准输出是最好的选择。
感谢任何帮助。
答案 0 :(得分:1)
[超小型语言无关的评论:你确定将原始PNG数据写入stdout是最好的吗?]
此外,您似乎正在使用libcurl
来获取该图片。好吧,如果您没有为CURL句柄设置自定义回调函数,那么它将直接写入stdout。
但是,如果这不是您打算做的,您可能需要查看realloc()
。
答案 1 :(得分:1)
理想情况下,您需要一种方法来了解正在下载的文件(图像)的大小。
使用libcurl首先获取标题并获取大小。
假设您将尺寸存储在 s
中当您分配缓冲区时,请执行
char *raw_image = malloc(s);
因为 s 是您必须保留的数据的大小而不是1024字节!
下载文件并将其存储在 raw_image
中然后
fwrite(raw_image, 1, s, stdout);
请注意, sizeof(raw_image)是指向缓冲区的指针的大小,因此在64位hw架构中为8个字节。 这不是文件的大小!
-
但是....
-
你正在提取图像,并在stdout上绘制它。
为什么不对 curl 进行简单的调用?
答案 2 :(得分:0)
你告诉fwrite写一个指针大小的20000个对象。这是因为sizeof(raw_image)返回raw_image的大小,这是一个指针,因此在大多数32位机器上是4个字节,在大多数64位机器上是8个字节。它不返回缓冲区raw_image指向的大小。
我不知道如何确定您正在下载的图像的大小,但您需要以某种方式确定该大小。一旦你这样做,你的fwrite调用应该是这样的:
fwrite(raw_image, 1, sizeOfTheImageInBytes, stdout)