簡體   English   中英

如何使用按鈕更新 GTK3 圖像以使用 C++ 從相機捕獲圖片

[英]How to update GTK3 image using a button to capture a picture from the camera using C++

我在 Pi 論壇上發布了這個,但我收到的唯一答案是我把它發布在了錯誤的地方。

在 Pi 論壇上發帖

我設法創建了一個程序來顯示一些按鈕和一個圖像。 現在我想在單擊按鈕時更新圖像。 我怎么做?

這是我到目前為止所擁有的,一切正常,但缺少更新顯示圖像的代碼。 此代碼中缺少 camrea.grab 之前的 3 秒延遲,但已添加到我正在使用的代碼中。

#include <iostream>
#include <raspicam/raspicam.h>
#include <wiringPi.h>
#include <gtk/gtk.h>

#include <fstream>
#include <vector>
#include <unistd.h>

using namespace std;

void Capture_Image(void){
    //camera setup
    raspicam::RaspiCam camera; //Camera object

    if (!camera.open()) 
    {
        cerr << "Could not open the camera" << endl; 
        //return 1;
    }

    camera.grab();

    std::vector<unsigned char> buf;
    buf.resize(camera.getImageTypeSize(raspicam::RASPICAM_FORMAT_RGB));

    camera.retrieve(buf.data(), raspicam::RASPICAM_FORMAT_RGB);

    std::ofstream outFile("/home/pi/s.jpg", std::ios::binary);
    outFile << "P6\n" << camera.getWidth() << " " << camera.getHeight() << " 255\n";
    outFile.write((char*)buf.data(), buf.size());

    cout << "Image saved to output.ppm" << endl;
}

int main(int argc, char **argv)
{
    wiringPiSetup();
    gtk_init (&argc, &argv);

    //Main Box
    GtkWidget *mainBox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
    gtk_container_add (GTK_CONTAINER (win), mainBox);

    //camera image container
    GtkWidget *cameraBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
    gtk_container_add (GTK_CONTAINER (mainBox), cameraBox);

    GtkWidget *cameraView = gtk_image_new_from_file("/home/pi/s.jpg");
    gtk_box_pack_start (GTK_BOX (cameraBox), cameraView, TRUE, TRUE, 0);

    //resize image
    GdkPixbuf *pixBuf = gtk_image_get_pixbuf(GTK_IMAGE(cameraView)); 
    pixBuf = gdk_pixbuf_scale_simple(pixBuf, 300,200,GDK_INTERP_BILINEAR);
    gtk_image_set_from_pixbuf(GTK_IMAGE(cameraView),pixBuf);

    //image capture button
    GtkWidget *imageCapture = gtk_button_new_with_label ("Image Capture");
    g_signal_connect (imageCapture, "clicked", G_CALLBACK (Capture_Image), NULL);
    gtk_box_pack_start (GTK_BOX (cameraBox), imageCapture, TRUE, TRUE, 0);

    //show the new window
    gtk_widget_show_all (win);
    //Start the GTK main loop
    gtk_main ();

    return 0;
}

我做了很多研究並找到了解決方案。

我像這樣更新了我的功能

void Capture_Image(GtkWidget *widget, gpointer image){

並在保存圖像后在我的函數中添加了此代碼。

GtkWidget *cameraView = (GtkWidget *) image;
gtk_image_set_from_file(GTK_IMAGE(cameraView),"/home/pi/s.jpg");
//resize image
GdkPixbuf *pixBufUpdate = gtk_image_get_pixbuf(GTK_IMAGE(cameraView)); 
pixBufUpdate = gdk_pixbuf_scale_simple(pixBufUpdate, 320,240,GDK_INTERP_BILINEAR);
gtk_image_set_from_pixbuf(GTK_IMAGE(cameraView),pixBufUpdate);

當我用按鈕打電話時,我用了這個

g_signal_connect (imageCapture, "clicked", G_CALLBACK (Capture_Image), cameraView);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM