25 июля 2009 г.

Вывод и масштабирование изображений

Из данной статьи Вы узнаете, что используя PHP-GTK можно очень просто вывести изображение в окно, а также, при необходимости, изменить его размер.


Для вывода изображения необходимо использовать метод GtkImage::new_from_file(), передав ему в качестве параметра адрес графического файла.
$path = '/home/shecspi/Картинки/gmail-icon-v2/gmail-icon-v2-256.png';
$image = GtkImage::new_from_file($path);


Для изменения размера изображения применяется метод scale_simple() класса GdkPixbuf. Первым параметром указывается новая ширина, вторым - новая высота, третьим - тип масштабирования. Эта трансформация касается только переменной $image и не затронет исходный файл.
$pixbuf = GdkPixbuf::new_from_file($path);
$pixbuf = $pixbuf->scale_simple($new_width, $new_height, Gdk::INTERP_HYPER);
$image->set_from_pixbuf($pixbuf);


Полный код программы:

<?php
 
$path = '/home/shecspi/Картинки/gmail-icon-v2/gmail-icon-v2-256.png';
 
$window = new GtkWindow();
$window->set_position(Gtk::WIN_POS_CENTER);
$window->set_default_size(400, 400);
$window->connect_simple('destroy', array('Gtk', 'main_quit'));
 
$toolbar = new GtkToolBar();
 
$zoom_in = new GtkToolButton();
$zoom_in->set_label('Увеличить');
$zoom_in->set_stock_id(Gtk::STOCK_ZOOM_IN);
$zoom_in->connect_simple('clicked', 'change_size', 'in', $path);
$toolbar->insert($zoom_in, -1);
 
$zoom_out = new GtkToolButton();
$zoom_out->set_label('Уменьшить');
$zoom_out->set_stock_id(Gtk::STOCK_ZOOM_OUT);
$zoom_out->connect_simple('clicked', 'change_size', 'out', $path);
$toolbar->insert($zoom_out, -1);
 
$image = GtkImage::new_from_file($path);
 
$scroll = new GtkScrolledWindow();
$scroll->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
$scroll->add_with_viewport($image);
 
$vbox = new GtkVBox();
$vbox->pack_start($toolbar, FALSE, FALSE);
$vbox->pack_start($scroll, TRUE, TRUE);
 
$window->add($vbox);
$window->show_all();
Gtk::main();
 
function change_size($action, $path)
{
global $new_width, $new_height, $image;
 
$size = getimagesize($path);
echo "Оригинальный размеры: ширина = ".$size[0].", высота = ".$size[1]."\n\r";
 
if ($new_width == 0)
{
$new_width = $size[0];
}
if ($new_height == 0)
{
$new_height = $size[1];
}
 
// Увеличиваем изображение
if ($action == 'in')
{
$new_width = $new_width + $new_width * 0.1;
$new_height = $new_height + $new_height * 0.1;
}
// Уменьшаем изображение
elseif ($action == 'out')
{
$new_width = $new_width - $new_width * 0.1;
$new_height = $new_height - $new_height * 0.1;
}
echo "Новые размеры: ширина = $new_width, высота = $new_height\n\r\n\r";
 
$pixbuf = GdkPixbuf::new_from_file($path);
$pixbuf = $pixbuf->scale_simple($new_width, $new_height, Gdk::INTERP_HYPER);
$image->set_from_pixbuf($pixbuf);
}
 
?>

2 комментария:

Анонимный комментирует...

Может не new_from_stock() (в Вашем примере его нет), а new_from_file()? И подписи к кнопкам одинаковые.

Shecspi комментирует...

Спасибо, исправил.