2012-10-04 89 views
0

我試圖構建一種從URL下載JPEG圖像並將其作爲PNG保存到磁盤中的算法。 要做到這一點我使用的libcurl,下載,並GdkPixbuff庫爲其他的東西(一個項目的限制,我貼到GDK庫)使用libCurl和GdkPixBuff將圖像從JPEG保存爲PNG

下面的代碼來實現數據:

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); 
} 

其中上下文的定義如下:在這種方式

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我已經計算寬度 * 3

我在哪裏錯了?

回答

0

gdk_pixbuf_new_from_data不支持JPEG格式。您必須首先將JPEG保存到文件並使用gdk_pixbuf_new_from_file加載。或者創建一個GInputStreamctx.data並使用gdk_pixbuf_new_from_stream

+0

我喜歡GInputStream方法。我已經嘗試使用* g_input_stream_read *函數寫入CURL的回調函數,但它會在第一次讀取嘗試後崩潰整個應用程序! – Archedius

+2

最簡單的路徑可能是使用'gdk_pixbuf_new_from_stream'並給它一個由['g_memory_input_stream_new_from_data()']創建的內存輸入流(http://developer.gnome.org/gio/unstable/GMemoryInputStream.html#g-memory-輸入流-新從數據)。這樣,curl下載邏輯保持簡單,並且gdk pixbuf保證加載'gdk_pixbuf_new_from_stream'支持的任何類型的資源。 – user4815162342

相關問題