2014-07-03 48 views
1

嘿所有, 我想用在Gtk :: DrawingArea中绘制活动图像,就像它们在火车站的显示器中显示的一样,机场,地铁等。GTKMM ::在GTk :: Drawing区域中使用单个Gdk :: PixBuf绘制多个图像

对于目前的测试目的,我硬编码我的代码。

在这里它是

的Gtk ::绘图区域宽度= 720,高度= 640。 我有first.pgm和second.pgm图像,每个图像都有360 * 640的分辨率(是的,我将它旋转用于测试目的)。 这些图像每像素包含一个字节。

1)当单张图像dr drawing时画得很好。 我只是将图像读入大小为360 * 640 * 3的无符号字符*缓冲区。 我看过像这样

int bufferIndex=0; 
int fileIndex=0; //just assume 
for (int i=0; i<height; i++) 
{ 
    for (int j=0; j<width; j++) 
    { 
     //below three lines are for RGB purpose required in Gdk::Pixbuf 
     buffer[bufferIndex++] = //File[fileIndex]; 
     buffer[bufferIndex++] = //File[fileIndex]; 
     buffer[bufferIndex++] = //File[fileIndex]; 
    } 
}    

Gdk::Colorspace colorSpace = Gdk::COLORSPACE_RGB; 
Gdk::Colorspace colorSpace = (Gdk::Colorspace)0; 
bool has_alpha = false; 
int bits_per_sample = 8; 
int rowStride = 360*3; // distance between rows in bytes 
Glib::RefPtr<Gdk::Pixbuf> pixBuf = Gdk::Pixbuf::create_from_data((const guint8 *) buffer, 
     colorSpace, has_alpha, bits_per_sample, 360, 640, rowStride); 
Glib::RefPtr<Gdk::GC> gcContext; 
pixBuf->render_to_drawable(drawingArea pointer, gcContext, 0, 0, 0 , 0 , 360, 640, Gdk::RGB_DITHER_MAX, 0, 0); 
//It prints the image in the left half of drawing area. 

这是我预料的一样,但有一个问题,当我试着画出两幅图像。 为此,我在缓冲区中读取first.pgm,然后读取second.pgm(表示总数[360 * 640 * 3] * 2个字节) 现在我按照代码中所示绘制它。

Glib::RefPtr<Gdk::GC>gcContext; 
Gdk::Colorspace colorSpace = Gdk::COLORSPACE_RGB; 
Gdk::Colorspace colorSpace = (Gdk::Colorspace)0; 
bool has_alpha = false; 
int bits_per_sample = 8; 
int rowStride = 360*3; // distance between rows in bytes 
Glib::RefPtr<Gdk::Pixbuf> pixBuf = Gdk::Pixbuf::create_from_data((const guint8 *) buffer, 
     colorSpace, has_alpha, bits_per_sample, 720, 640, rowStride); 
pixBuf->render_to_drawable(drawingarea pointer, gcContext, 0, 0, 0 , 0 , 720, 640, Gdk::RGB_DITHER_MAX, 0, 0); 

在两个半部分中,打印first.pgm。

回答

2

您可以使用create_from_file()方法打开这些图像,并将其复制到将要显示的其他Pixbuf。 这里是我的代码:

DrawingArea.h

#ifndef DRAWINGAREA_H 
#define DRAWINGAREA_H 

#include <gtkmm.h> 


class DrawingArea : public Gtk::DrawingArea 
{ 
public: 
    DrawingArea(); 

protected: 
    // Override default signal handler: 
    virtual bool on_draw(const Cairo::RefPtr<Cairo::Context>& cr); 
private: 
    // 1.Pgm image 
    Glib::RefPtr<Gdk::Pixbuf> image1; 
    // 2.Pgm image 
    Glib::RefPtr<Gdk::Pixbuf> image2; 
    //Pixel buffer for display 
    Glib::RefPtr<Gdk::Pixbuf> display; 
    // Scale of the image 
    double scale; 
}; 
#endif // DRAWINGAREA_H 

DrawingArea.cpp

#include "DrawingArea.h" 

DrawingArea::DrawingArea() 
{ 
    // Load the images 
    image1 = Gdk::Pixbuf::create_from_file("first.pgm"); 
    image2 = Gdk::Pixbuf::create_from_file("second.pgm"); 
    //create a 720x640 rgb Pixbuf 
    display = Gdk::Pixbuf::create(Gdk::COLORSPACE_RGB,0,8,720,640); 
} 
// Call when the display need to be updated 
bool DrawingArea::on_draw(const Cairo::RefPtr<Cairo::Context>& cr) 
{ 
    //copy the two images to the display Pixbuf with this function: 
    //void Gdk::Pixbuf::copy_area (int src_x,int src_y,int width,int height,const Glib::RefPtr<Gdk::Pixbuf>& dest_pixbuf,int dest_x,int dest_y)  
    image1->copy_area(0,0,360,640,display,0,0); 
    image2->copy_area(0,0,360,640,display,360,0); 
    // Place the display Pixbuf at the center of the window 
    Gdk::Cairo::set_source_pixbuf(cr, display, 0,0); 
    // Update the whole drawing area 
    cr->rectangle(0, 0, display->get_width(), display->get_height()); 
    // Fill the area with the image 
    cr->fill(); 
    // The event has been handled. 
    return true; 
} 

而且main.cpp中

#include <DrawingArea.h> 
#include <gtkmm.h> 


int main(int argc, char* argv[]) 
{ 
    // Initialize gtkmm and create the main window 
    Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "betontaplfa"); 
    Gtk::Window window; 

    // Create the drawing 
    DrawingArea Dwg; 
    // Insert the drawing in the window 
    window.add(Dwg); 
    // Resize the window 
    window.resize(720,640); 
    // Set the window title 
    window.set_title("Pgm"); 
    // Show the drawing 
    Dwg.show(); 

    // Start main loop 
    return app->run(window); 
}