Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Управление качеством изображения, с помощью GD 
:(
    Опции темы
shootnix
  Дата 9.3.2006, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 3.9.2005
Где: Казахстан

Репутация: 2
Всего: 2



Вот такая трабла у меня: ресайзю картинку на севере (jpeg) с исходного 800х600 до нужного 100х75.
Всё бы ничего, вот только качество просто никакущее! Ну плохо всё видать.

Есть ли у GD спецомные фишки насчёт качества изображения. А то я так думаю, что это просто вследствие максимального сжатия происходит... Есть ли способ программно управлять этим процессом?
PM WWW ICQ   Вверх
sharq
Дата 9.3.2006, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 23
Всего: 28



shootnix,

Цитата

GD allows you to create color drawings using a large number of graphics primitives, and emit the drawings as PNG files.


Если тебе реально важно качество картинки (тем более jpeg), используй ImageMagick, не много медленее работает, но зато качественно!

smile


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
shootnix
Дата 9.3.2006, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 3.9.2005
Где: Казахстан

Репутация: 2
Всего: 2



Да уж... нет у меня на хосте этого самого... ImageMagik.
PM WWW ICQ   Вверх
nitr
Дата 9.3.2006, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Установи или юзай
Код

use lib qw(./packages);

создав папку packages и внеси туды распакованный модуль со SEARCH.CPAN.ORG


--------------------
PM   Вверх
sharq
Дата 9.3.2006, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 23
Всего: 28



nitr, ничего не получится так, нужно еще дистрибутив ImageMagick поставить на сервер.
ImagickMagick - это утилита, "фотошоп" для командной строки.
А из perl просто можно вызвать его функции (для этого и не нужен модуль).

smile


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
nitr
Дата 9.3.2006, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Обычно библиотеки в *nix стоят, так как пхп развит ;) а он юзает данные либы!


--------------------
PM   Вверх
korob2001
Дата 10.3.2006, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



А почему бы не связаться с Support и не попросить их установить нужный модуль? Image::Magick уменьшает изображения без потери качества, ну точнее потеря такая же как и у PhotoShop'a. Если нужно, могу запостить код, которым я уменьшаю изображения с Image::Magick

Это сообщение отредактировал(а) korob2001 - 10.3.2006, 10:15


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
rcdimon
Дата 10.3.2006, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: 1
Всего: 2



да, давай, пости smile
PM MAIL ICQ   Вверх
korob2001
Дата 10.3.2006, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Здесь я заюзал ещё и Image::Size, его можно установить сначала на свой локальный копмпьютер, а затем вручную создать на сервере каталог Image и скопировать в него каталог /Size и файл Size.pm из локального каталога библиотеки. Затем добавить в @INC путь к новой библиотеки, либо заюзать use lib ();
Проверял лично, всё чудесно работатет.
Код

#!/usr/bin/perl -w
use strict;
use Image::Size;
use Image::Magick;


file_reparation("D:", "120x80", "tmpx.jpg", "small.jpg");

sub file_reparation {
    my($img_dir,$to_size,$original_file,$new_file) = @_;

    # Узнаём ширину и высоту оригинала
    my( $width, $height ) = imgsize("$img_dir/$original_file");

    # Если не удалось получить ширину и высоту оригинала, вернём false
    return 0 unless $width or $height;

    # Создаём объект Image::Magick
    my $image   = Image::Magick->new();
    # Считываем оригинал
    my $img_obj = $image->Read("$img_dir/$original_file");

    # Разбиваем полный размер на ширину и высоту до которых нужно изменить изображение
    my( $to_width, $to_height ) = split("x", $to_size);

    # Вычисляем ширину если хотим уменьшить высоту до 200, это
    # необходимо для сохранения пропоций изображения.
    my $x_width = eval{ $width / $height * $to_height };

    # Уменьшаем изображение
    $image->Resize( width => $x_width, height => $to_height );

    # Если ширина получилась больше необходимой, то урезаем изображение.
    if ( $x_width > $to_width ) {
         # Вычисляем откуда нужно резать изображение
         my $x_cut = int( ( $x_width - $to_width ) / 2 );
         # Задаём позицию, с которой будем резать изображение
         $image->Crop(x => $x_cut, y => 0);
         # Режем изображение
         $image->Crop( $to_size );
    }

    # Сохраняем изображение
    $image->Write("$img_dir/$new_file");
    return 1;
}

Подпрограмма получает 4 параметра:
1) Путь к каталогу где находится изображение.
2) Размер до которого нужно уменьшить изображение в формате "120x80"
3) Имя файла оригинала.
4) Имя нового файла.

У этого алгоритма сохранения пропорций, есть один недостаток. Если высота изображения больше ширины, то может получиться не совсем то, что нужно. Но это очень легко исправить, а у меня как-то руки не доходят до этого. ;(((((( Может кто-нить из вас возьмётся сделать это? Вот что я имею ввиду:

1) После того как мы узнали размер оригинала:
Код

# Узнаём ширину и высоту оригинала
my( $width, $height ) = imgsize("$img_dir/$original_file");

Было бы не плохо создать условие
Код

if ( высота > ширины ) {
     # Вот здесь нужно сделать впринципе то же самое, но наоборот, сначала
     # вместо $x_width, поулить $x_height, т.е. взять за основу не ширину, а высоту
     # Это сделать дастаточно легко имея код выше.
} else {
     # Здесь код как и прежде, сохраняем пропорции отталкиваясь от ширины
}


Если например нам не нужен оригинал, то вызвать данную подпрограмму, можно так:
Код

if ( file_reparation("D:", "120x80", "tmpx.jpg", "small.jpg") ) {
     unlink("D:/tmpx.jpg") or warn "Can't remove file: $!\n";
} else {
     warn "Can't resize file, because file is not image :(((\n";
}

Так же, внутрь подпрограммы, можно добавить ещё один параметр, путь к каталогу, в который нужно сохранять новое изображение. Зачастую так и нужно делать, очень редко нужно сохранять изображение в тот же каталог, где лежит оригинал.

Вобщем пробуйте. ;))))))

Это сообщение отредактировал(а) korob2001 - 10.3.2006, 12:11


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Vaneska
Дата 20.3.2006, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 15.3.2005
Где: Москва

Репутация: 3
Всего: 4



А не лучше узнавать размер изображения напрямую через Image::Magick?
--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
korob2001
Дата 20.3.2006, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Цитата(Vaneska @ 20.3.2006, 08:47 Найти цитируемый пост)
А не лучше узнавать размер изображения напрямую через Image::Magick?

А не лучше ли взять, да запостить сюда пример, вмето того, что бы задавать подобные вопросы? smile


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Vaneska
Дата 20.3.2006, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 15.3.2005
Где: Москва

Репутация: 3
Всего: 4



Исправляюсь ... smile

Код

my $width = $img->Get('columns');
my $height = $img->Get('rows');


Документация лежит здесь:
http://imagemagick.org/script/perl-magick.php

Это сообщение отредактировал(а) Vaneska - 20.3.2006, 14:06
--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
korob2001
Дата 20.3.2006, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Спасибо, подправил:
Код

#!/usr/bin/perl -w
use strict;
use Image::Magick;

file_reparation("D:", "120x80", "100_1189.jpg", "small.jpg");

sub file_reparation {
    my($img_dir,$to_size,$original_file,$new_file) = @_;

    # Создаём объект Image::Magick
    my $image   = Image::Magick->new();

    # Считываем оригинал
    my $img_obj = $image->Read("$img_dir/$original_file");

    # Узнаём ширину и высоту оригинала
    my $width   = $image->Get('columns');
    my $height  = $image->Get('rows');

    # Если не удалось получить ширину или высоту оригинала, вернём false
    return 0 unless $width or $height;

    # Разбиваем полный размер на ширину и высоту до которых нужно изменить изображение
    my( $to_width, $to_height ) = split("x", $to_size);

    # Вычисляем ширину если хотим уменьшить высоту до 200, это
    # необходимо для сохранения пропоций изображения.
    my $x_width = eval{ $width / $height * $to_height };

    # Уменьшаем изображение
    $image->Resize( width => $x_width, height => $to_height );

    # Если ширина получилась больше необходимой, то урезаем изображение.
    if ( $x_width > $to_width ) {
         # Вычисляем откуда нужно резать изображение
         my $x_cut = int( ( $x_width - $to_width ) / 2 );
         # Задаём позицию, с которой будем резать изображение
         $image->Crop(x => $x_cut, y => 0);
         # Режем изображение
         $image->Crop( $to_size );
    }

    # Сохраняем изображение
    $image->Write("$img_dir/$new_file");
    return 1;
}



--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
nitr
Дата 20.3.2006, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



А разве не подходят модули Image::Magick::Thumbnail ?



--------------------
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0562 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.