0

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

DownloadedPicを次のように記述します。

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画像です。これで、画像、幅、高さのサイズは確かにわかりましたが、* 3として計算したRowStrideをいじったと思います。

どこが間違っていますか?

4

1 に答える 1

0

gdk_pixbuf_new_from_dataJPEG形式をサポートしていません。最初にJPEGをファイルに保存してから、を使用してロードする必要がありgdk_pixbuf_new_from_fileます。または、GInputStream周りctx.dataを作成して使用しますgdk_pixbuf_new_from_stream

于 2012-10-04T13:54:02.627 に答える