GTKベースの関数imshow:読み出しとGTKのstb_imageで画像を表示します

一方の前にすることができたGTKに基づいて、読み取った画像を表示します以上のいずれかを上記:GDIベース関数imshow:stb_image、図面を用いて画像を読み取り、補正 GDIのstb_imageによって画像を読み取って画像を表示すると、関数imshowを実現します。使用stb_imageに基づいて双方でBenpianは、画像を読み取り、そしてGTKディスプレイ、ベースのGTK関数imshowの初期実現を使用します。

最初は、指定されたバッファとディスプレイ(文献1)から画像GTKを作成するコードを見つけることです。そして、STB画像読み取り、私はFC画像のOpenCVを取得し、以前のパッケージを持っていたし、互換性のBGR形式です。しかし、順序はGTK RGBを見つけるために必要とされるので、それらは、変換ステップを行った:BGR RGBし、その画像を生成するために対応するバッファGTKを渡します。

コードの実装

完全なコードが必要とGDIベースの関数imshowを:使用読み込み、レンダリング画像を修正stb_imageこのブログの記事のコードを、この記事のコードを追加しますgtk_show_image_v3.c

#include <gtk/gtk.h>
#include <stdlib.h>
#include <assert.h>

#include "fc_image.h"

void fc_bgr_to_rgb(FcImage* im) {
    if (im==NULL) return;
    if (im->c<=0 || im->h<=0 || im->w==0) return;
    assert(im->c==3);

    int num_pixel = im->c * im->h * im->w;
    unsigned char t;
    for(int i=0; i<num_pixel; i+=3) {
        t = im->data[i];
        im->data[i] = im->data[i+2];
        im->data[i+2] = t;
    }
}

int main (int argc, char *argv[])
{
    const char* im_pth = "/home/zz/work/libfc/imgs/fruits.jpg";
    FcImage im = fc_load_image(im_pth);
    fc_bgr_to_rgb(&im);


    GtkWidget *window;
    GtkWidget* image;

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    GdkPixbuf *pixbuf = gdk_pixbuf_new_from_data (im.data, GDK_COLORSPACE_RGB,
        FALSE, 8, im.w, im.h, im.w*3, NULL, NULL);

    gtk_window_set_title (GTK_WINDOW (window), "Image Viewer");

    g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

    image = gtk_image_new_from_pixbuf (pixbuf);
    gtk_container_add(GTK_CONTAINER (window), image);

    gtk_widget_show_all (window);

    gtk_main ();

    return 0;
}

シンプルなパッケージ

アカウントに画像バッファRGBを変更する既存のBGR順序を取ると、場所の変更は、アルゴリズムのその後の使用に影響を与え、確かに問題です。したがって、画像データの新しいコピーを生成します。そしてまた、後で呼び出しのために、APIパッケージの、パラメータ、およびタイトルとしてイムする必要があります。修正されたコードを次のように

#include <gtk/gtk.h>
#include <stdlib.h>
#include <assert.h>

#include "fc_image.h"

void fc_copy_bgr_to_rgb(const FcImage* src, FcImage* dst) {
    if (src==NULL) return;
    if (dst==NULL) return;
    assert(src!=dst);
    assert(src->data!=NULL);
    assert(dst->data!=NULL);
    assert(src->data!=dst->data);
    assert(src->c>=0 && src->h>=0 && src->c==3);
    assert(src->c>=0 && src->h>=0 && src->c==3);
    assert(src->c==dst->c && src->h==dst->h && src->w==dst->w);

    int num_pixel = src->c * src->h * src->w;
    for(int i=0; i<num_pixel; i+=3) {
        dst->data[i] = src->data[i+2];
        dst->data[i+1] = src->data[i+1];
        dst->data[i+2] = src->data[i];
    }
}

FcImage fc_make_image(int w, int h, int c)
{
    FcImage out;
    out.w = w;
    out.h = h;
    out.c = c;
    out.data = (unsigned char*)calloc(h*w*c, sizeof(float));
    return out;
}

void gtk_show_image_v3(const FcImage* im, const char* title)
{
    FcImage im_rgb = fc_make_image(im->w, im->h, im->c); //?? check this dimensions
    fc_copy_bgr_to_rgb(im, &im_rgb);

    GtkWidget *window;
    GtkWidget* image;

    gtk_init (NULL, NULL);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    GdkPixbuf *pixbuf = gdk_pixbuf_new_from_data (im_rgb.data, GDK_COLORSPACE_RGB,
        FALSE, 8, im_rgb.w, im_rgb.h, im_rgb.w*3, NULL, NULL);

    gtk_window_set_title (GTK_WINDOW (window), title);

    g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

    image = gtk_image_new_from_pixbuf (pixbuf);
    gtk_container_add(GTK_CONTAINER (window), image);

    gtk_widget_show_all (window);

    gtk_main ();
}


int main (int argc, char *argv[])
{
    const char* im_pth = "/home/zz/work/libfc/imgs/fruits.jpg";
    FcImage im = fc_load_image(im_pth);
    const char* title = "fruits";
    gtk_show_image_v3(&im, title);

    return 0;
}

参照

LinuxではGTKを使用して一連の画像を表示

おすすめ

転載: www.cnblogs.com/zjutzz/p/10960235.html