我正在尝试构建一种算法,从URL下载JPEG图像并将其作为PNG保存到磁盘中。 为了达到这个目的,我使用了libCurl进行下载,并使用GdkPixbuff库进行其他工作(对于项目限制我坚持使用Gdk库)
这里是实现数据的代码:
CURL *curl;
GError *error = NULL;
struct context ctx;
memset(&ctx, 0, sizeof(struct context));
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, *file_to_download*);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeDownloadedPic);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ctx);
curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
其中 context 的定义如下:
struct context
{
unsigned char *data;
int allocation_size;
int length;
};
以这种方式和 writeDownloadedPic :
size_t writeDownloadedPic (void *buffer, size_t size, size_t nmemb, void *userp)
{
struct context *ctx = (struct context *) userp;
if(ctx->data == NULL)
{
ctx->allocation_size = 31014;
if((ctx->data = (unsigned char *) malloc(ctx->allocation_size)) == NULL)
{
fprintf(stderr, "malloc(%d) failed\n", ctx->allocation_size);
return -1;
}
}
if(ctx->length + nmemb > ctx->allocation_size)
{
fprintf(stderr, "full\n");
return -1;
}
memcpy(ctx->data + ctx->length, buffer, nmemb);
ctx->length += nmemb;
return nmemb;
}
最后我尝试以这种方式保存图像:
GdkPixbuf *pixbuf;
pixbuf = gdk_pixbuf_new_from_data(ctx.data,
GDK_COLORSPACE_RGB,
FALSE, 8,
222, 310,
222 * 3,
NULL, NULL);
gdk_pixbuf_save(pixbuf, "src/pics/image.png", "png", &error, NULL);
但是,我得到的是一个带有一堆随机像素的小小png图像,根本不是形式。现在,我肯定知道图像,宽度和高度的尺寸,但我认为我已经对 RowStride 做了一些混乱,我计算为 width * 3。
我哪里错了?
答案 0 :(得分:0)
gdk_pixbuf_new_from_data
不支持JPEG格式。您必须先将JPEG保存到文件中,然后使用gdk_pixbuf_new_from_file
加载它。或者在GInputStream
周围创建ctx.data
并使用gdk_pixbuf_new_from_stream
。