【发布时间】:2020-12-16 12:54:53
【问题描述】:
第一:
我正在研究一个暗场显微跟踪程序。这个程序是旧的(2012 年),我们有一个新相机,但这个相机不能用捕捉程序捕捉。所以我需要用相机公司的SDK(软件开发工具包)为这个相机编写一个“捕捉程序”。
跟踪程序是用C和GTK 2编写的,所以我也想用C和GTK 2编写“捕获程序”,所以我可以把“捕获程序”放在我的跟踪程序中。我可以在“抓拍程序”里面拍照,显示为gtk_image_new_from_pixbuf。
问题:
能够拍照后发现暗视野显微镜无法让你用眼睛为相机设置焦距。所以现在我需要捕捉“实时图像”、视频或者你想怎么称呼它。
我的想法是使用一个计时器,这样相机就会每秒拍摄一张照片并将其显示为图像,因此程序必须删除旧图像并显示新图像。
但这不会发生我很确定相机没有问题,因为它显示了第一张图像。我的猜测是 pixbuf 没有被清除,导致没有显示新图像。
“捕获程序”不必保留为 C/Gtk2 程序,但由于我不是计算机科学家,我只是不知道如果图像不同,如何将图像输入跟踪程序。
代码:
我知道gdk_pixbuf_new_from_data 的星号是width*1 而不是width*3,这没问题。
#include <gtk/gtk.h>
#include <stdlib.h>
unsigned short *buffer = NULL;
long imageSize = 0;
void draw_call (GtkWidget *window, GdkEvent *event, gpointer data){
(void)event; (void)data;
GdkPixbuf *pix;
GtkWidget* image;
image = gtk_image_new();
free (buffer);
long result = NOERR;
//camera commands had to be changed
result = getImageSizeFromCamera( &imageSize);
result = SetBitsPerPixel(8);
buffer = (unsigned short *) malloc( imageSize*2);
result = takePicture(camera, buffer, imageSize/2, NULL, NULL);
result = stopTakingPicture (camera);
//end of camera commands
pix = gdk_pixbuf_new_from_data ((unsigned int *) buffer, GDK_COLORSPACE_RGB,FALSE, 8,
1936, 1460, 1936*1, pixbuf_free, NULL);
image = gtk_image_new_from_pixbuf(pix);
return image;
gtk_widget_unref (pix);
}
void pixbuf_free(guchar *pixels, gpointer data)
{
g_free(pixels) ;
fprintf(stderr, "pixbuf data freed\n") ;
}
int main (int argc, char *argv[])
{
GdkPixbuf *pixbuf;
// GTK
GtkWidget *window;
GtkWidget* image;
image = gtk_image_new();
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "Image Viewer");
g_signal_connect (window, "destroy", G_CALLBACK (Deinit), NULL);
g_signal_connect (window, "expose-event",G_CALLBACK (draw_call), NULL);
g_timeout_add (1000, draw_call, NULL);
gtk_widget_set_app_paintable(window, TRUE);
gtk_widget_set_double_buffered(window, FALSE);
gtk_container_add(GTK_CONTAINER (window), image);
gtk_widget_show_all (window);
gtk_main ();
return 0;
}
【问题讨论】:
-
您已经有一张图片,并且想要更新内容。 gtk_image_set_from_pixbuf 而不是
gtk_image_new_from_pixbuf呢?这没有任何意义return image; gtk_widget_unref (pix);有两个原因:1)函数data_call具有返回类型void和 2)在return语句之后没有更多代码可以访问。还有谁应该使用该返回值? -
我对 gtk2 不太熟悉,但我认为您应该将
image指针作为用户参数从main传递给draw_call,并使用新的 pixbuf 更新该图像。跨度> -
gtk_image_set_from_pixbuf我会试试的。对于返回后的_unref (pix),我在其他帖子中看到了它并尝试了一下。对于函数data_call为什么它是void我不知道还能用什么。我会尝试使用image指针的想法。 -
那么其他代码是错误的。
return的主要目的是立即离开当前函数并为调用者提供一个值。如果您离开该功能,所有剩余的代码都是死代码。计时器处理程序也不知道如何处理您的返回值。