Всем привет,
Я пытаюсь рисовать живые изображения в Gtk :: DrawingArea так же, как они отображаются на мониторах на вокзалах, в аэропортах, метро и т. Д.
Для текущей цели тестирования я жестко закодировал свой код.
вот
Gtk :: Ширина области рисования = 720, высота = 640.
У меня есть изображения first.pgm и second.pgm, каждый из которых имеет размеры 360 * 640 (да, я повернул его для тестирования).
Эти изображения содержат один байт на пиксель.
1) хорошо рисует при нанесении одиночного изображения.
Я просто прочитал изображение в буфер без знака * размером 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.
Вы можете открыть эти изображения с помощью метода 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);
}