Как изменить размер изображения с помощью PHP, сохранив при этом разрешение?

Мне интересно, есть ли способ изменить размер пакета изображений с помощью библиотеки, такой как GD или ImageMagick, чтобы уменьшить размер изображения при сохранении его разрешения?

В настоящее время я начинаю с очень большого изображения (примерно 3500 X 2400 @ 300ppi), когда я пытаюсь изменить размер изображения (примерно до 1000 X 775), я получаю большое изображение в правильных размерах, но разрешение падает до 72ppi ( подтверждено фотошопом).

$im = new Imagick();
//Initial resolution of image
$im->setResolution(300,300);

$im->readImage('mypdf.pdf');
$im->adaptiveResizeImage(707,1000);

Я также использовал:

$image->resizeImage(707,1000, imagick::FILTER_LANCZOS, 0.9, true);

Но в итоге получается примерно то же самое. Заранее спасибо. Любые предложения приветствуются.

После прочтения предложений вот как выглядит мой код прямо сейчас

$im = new Imagick();
$im->setResolution(300,300);

$im->readImage('mypdf.pdf');
$im->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH);
$im->adaptiveResizeImage(707,1000);
$im->setResolution(300,300);
$im->setImageFormat( "jpg" );
$originalImageFile = 'myjpg.jpg';
$im->writeImage($originalImageFile);$im->setResolution(300,300);

Выходное изображение имеет очень низкое качество, вот как оно выглядит

http://i46.tinypic.com/ehfyf8.jpg


person CharlieM    schedule 07.06.2012    source источник
comment
то, что вы называете «разрешением», на самом деле является плотностью пикселей. Очевидно, что если «физические размеры» изображения останутся прежними, а количество пикселей уменьшится, плотность пикселей тоже уменьшится, не так ли?   -  person SirDarius    schedule 07.06.2012
comment
Я удалил ответ, потому что вы, кажется, изменяете размер PDF-файлов. Пожалуйста, уточните сообщение, чтобы было ясно, что вы говорите об изображениях внутри PDF-файлов.   -  person Pekka    schedule 07.06.2012
comment
@SirDarius, но физические размеры не остаются прежними - он уменьшает изображение. Плотность пикселей должна оставаться 300 пикселей на дюйм, но изображение сохраняется с разрешением 72 пикселей на дюйм.   -  person Brian    schedule 07.06.2012
comment
тогда да, плотность пикселей нужно сбросить после операции изменения размера. Также вы можете сделать это: $im-›setImageUnits(imagick::RESOLUTION_PIXELSPERINCH);   -  person SirDarius    schedule 07.06.2012
comment
Привет, спасибо за все ответы! Пекка. На самом деле я режу PDF-файлы и конвертирую каждую страницу в изображение. Сир Дариус. Я собираюсь протестировать добавление RESOLUTION_PIXELSPERINCH.   -  person CharlieM    schedule 07.06.2012
comment
Так работает и не работает. Параметр RESOLUTION_PIXELSPERINCH возвращает значение плотности пикселей изображения к 300PPI. Тем не менее, изображение ПО-ПРЕЖНЕМУ размыто, что наводит меня на мысль, что функция изменения размера снижает плотность изображения до 72 пикселей на дюйм, и если вы потеряли данные, масштабирование их обратно не помогает. Н.Б. Я также добавил изменение разрешения перед изменением размера.   -  person CharlieM    schedule 07.06.2012
comment
В качестве дополнения к интересующимся. Я думаю, что решил проблему (спасибо всем за помощь). Порядок выполнения операций имеет значение. $im-›setResolution(300,300); $im-›resizeImage(700,1000, imagick::FILTER_LANCZOS, 0,9, правда); $im-›setImageFormat(jpg); $im-›writeImage(); $im-›writeImage($originalImageFile); Кроме того, FILTER_LANCZOS, по-видимому, является самым медленным из фильтров, но создает изображения самого высокого качества.   -  person CharlieM    schedule 19.06.2012


Ответы (2)


Посмотрите первый комментарий здесь:

http://php.net/manual/en/imagick.setresolution.php

В дополнение к настройке разрешения вы также должны установить единицы разрешения:

$im->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH);
person Brian    schedule 07.06.2012
comment
Надеюсь, вы не возражаете, я включил соответствующую часть ссылки в ваш ответ. ТАК ответы должны быть ответами, а не ссылками - ссылки могут устареть. Однако нет ничего плохого в том, чтобы указывать ваши источники. - person Mark Ransom; 07.06.2012
comment
Как уже упоминалось, на самом деле это не работает, потому что я предполагаю, что функция масштабирования изображения вызывает потерю плотности пикселей. - person CharlieM; 07.06.2012
comment
Хорошо, вот изображение, показывающее, в чем проблема, я использую -›setImageUnits, i46.tinypic. com/ehfyf8.jpg так мой код выглядит прямо сейчас pastebin.com/wfaeSv2b - person CharlieM; 07.06.2012
comment
@CharlieM, попробуйте сохранить его в формате без потерь, например PNG. Или, может быть, установите единицы разрешения, затем установите разрешение, а затем прочитайте изображение. - person Brian; 07.06.2012

Попробуйте снова вызвать setResolution после изменения размера изображения перед его сохранением на диск. Кроме того, см. примечания о плотности здесь: документация ImageMagick.

person Christian    schedule 07.06.2012