Я обрабатываю изображения, когда пользователь загружает изображение, но моя проблема связана с высоким разрешением. Как вы обнаруживаете, когда пользователь ее загружает? Я использую библиотеку GD для PHP. Установка качества до 90 с помощью метода imagejpeg () ничего не делает с ним, но масштабирует измерение, а затем устанавливает ppi на 72. Я хочу иметь возможность сохранить измерение и одновременно отбросить ppi до 72. Любые советы будут очень признательны.
Нет такой вещи, как ИЦП, насколько вам нужно беспокоиться. Кроме того, DPI не существует в цифровом формате. Есть только пиксели и размеры (которые являются всего лишь измерением пикселей в любом направлении).
То, что вы действительно пытаетесь сделать, – это уменьшить изображение, уменьшив габаритные размеры изображения. Вероятно, вы захотите сделать это пропорционально, то есть хотите сохранить одинаковое соотношение ширины и высоты, чтобы изображение не выглядело растянутым после повторной выборки. Также стоит отметить, изменение размера и повторная выборка различаются тем, что изменение размера не уделяет большого внимания контенту, что приводит к очень визуально-плохому изменению размеров изображений. Вы, вероятно, хотите передискретизировать.
В документации по PHP есть несколько отличных примеров обработки загруженных файлов, а также способов изменения размеров изображений с использованием библиотеки GDImage. Я предлагаю вам проверить их. Другие соответствующие методы, о которых вы, возможно, захотите узнать:
Во-первых, давайте уточним терминологию. И PPI (пиксели на дюйм), и DPI (точка на дюйм) являются отношениями, которые определяют преобразование пикселей в физические единицы (в этом случае дюйм). В цифровом мире – компьютеры, изображения, … DPI ошибочно используется там, где PPI следует использовать . DPI фактически существует только в мире печати. Но для нас сейчас DPI = PPI . >> Больше информации
Информация о разрешении (иногда называемая DPI, но это PPI) сохраняется в заголовках (метаданных изображения). JPG и PNG поддерживают это; но GIF не поддерживает DPI – его нет в заголовке GIF .
Итак, вы, вероятно, спрашиваете, как установить PPI (DPI) в заголовок изображения? В PHP вы можете сделать это с помощью библиотеки Imagick (конечно, не для GIF):
$image = new Imagick('img.jpg'); // default 72 dpi image $image->setImageResolution(500, 500); $image->writeImage("img-500dpi.jpg"); // this image will have 500 dpi
Если вы загружаете эти изображения и пытаетесь распечатать их, например, в IrfanView, он фактически будет использовать информацию о dpi для преобразования пикселей в целевую физическую единицу. Оба изображения будут напечатаны в разных размерах.
Плохая новость заключается в том, что это ничего не изменит при отображении изображения на веб-странице. Якорный блок для отображения всегда является пикселем в CSS. Поэтому img.jpg
и img-500dpi.jpg
будут иметь точно такой же размер в браузере. Даже если вы открываете изображения напрямую. Даже если вы используете физическую единицу, например cm
:
img { width: 8cm; height: 6cm; }
оба изображения будут отображаться одинакового размера; физические единицы преобразуются в пиксели независимо от разрешения изображения с использованием фиксированного отношения . И удивительно, даже если вы попытаетесь напечатать необработанные изображения (а не страницу) в Firefox, они оба будут напечатаны одинакового размера. Не могу комментировать другие браузеры. Достаточно странно – это работает в Ирфанвью.
Теперь с Iphones и т. Д. Изображения сетчатки (то есть высокого разрешения) становятся модными. Здесь много говорится о DPI (на самом деле PPI), но все это связано только с целевым устройством и запросами на мультимедиа CSS . Нет ничего, что бы действительно распознало ИЦП вашего изображения; вы должны указать фактические размеры изображения сетчатки высокого разрешения в пикселях. Это пример значка 66×66 ( отсюда ):
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { .box { background:url('images/icon66x66.png') no-repeat top left; background-size: 33px 33px; } }
Таким образом, вы можете фактически «уменьшить масштаб» изображений с высоким разрешением, установив для них более низкие размеры в CSS . Но я бы рекомендовал сделать это только для изображений сетчатки и в правильном запросе на медиа.
Таким образом, на самом деле, если вы хотите, чтобы загруженное изображение выглядело меньше «в Интернете», лучшим способом является его повторная выборка. Повторная выборка означает не изменять только заголовок, а изменять фактическую матрицу пикселей изображения. Вот код, который я использую в PHP, который использует библиотеку GD:
$t = imagecreatefromjpeg($old_img_path); $s = imagecreatetruecolor($new_width, $new_height); $x = imagesx($t); $y = imagesy($t); imagecopyresampled($s, $t, 0, 0, 0, 0, $new_width, $new_height, $x, $y); imagejpeg($s, $new_img_path); chmod($new_img_path, 0644);
Имейте в виду, что для этого требуется довольно много памяти, которая может быть ограничена вашим хостинг-провайдером.
Если вы имеете дело с изображениями высокого разрешения, я бы спустился по пути ImageMagick, так как он быстрее + дает намного больше информации об изображениях +, позволяет вам записывать образы назад при 300 DPI (или других разрешениях), если вы хотите ,
Вот что я делаю с Jcrop и ImageMagick (но при 72 DPI)
$picture = new Imagick($src); $picture->cropImage( $_POST['w'], $_POST['h'], $_POST['x'], $_POST['y']); $picture->resizeImage(690, 500, Imagick::FILTER_LANCZOS,1, true); $picture->writeImage($cropped); $picture->clear(); $picture->destroy();
-$picture = new Imagick($src); $picture->cropImage( $_POST['w'], $_POST['h'], $_POST['x'], $_POST['y']); $picture->resizeImage(690, 500, Imagick::FILTER_LANCZOS,1, true); $picture->writeImage($cropped); $picture->clear(); $picture->destroy();
-$picture = new Imagick($src); $picture->cropImage( $_POST['w'], $_POST['h'], $_POST['x'], $_POST['y']); $picture->resizeImage(690, 500, Imagick::FILTER_LANCZOS,1, true); $picture->writeImage($cropped); $picture->clear(); $picture->destroy();
Использование phpthumb ( http://phpthumb.gxdlabs.com ) – это хорошее, элегантное и простое решение.
У меня есть пример рабочего кода, который он загружает в GitHub. Он может использовать как GD, так и Imagemagick, это зависит от вас.
bool Imagick :: setResolution (float $ x_resolution, float $ y_resolution)
Если вы уменьшаете ppi, размеры меняются, чтобы отражать уменьшение – меньше пикселей на дюйм означает, что на вашем снимке будет меньше дюймов.