Я обрабатываю изображения, когда пользователь загружает изображение, но моя проблема связана с высоким разрешением. Как вы обнаруживаете, когда пользователь ее загружает? Я использую библиотеку GD для PHP. Установка качества до 90 с помощью метода imagejpeg() ничего не делает с ним, но масштабирует измерение, а затем устанавливает ppi на 72. Я хочу иметь возможность сохранить измерение и одновременно отбросить ppi до 72. Любые советы будут очень признательны.Как изменить размер изображения с высоким разрешением с помощью PHP
ответ
Нет такой вещи, как ИЦП, насколько это необходимо. Кроме того, DPI не существует в цифровом формате. Есть только пиксели и размеры (которые являются всего лишь измерением пикселей в любом направлении).
Что вы действительно пытаетесь сделать, это уменьшить изображение, уменьшив габаритные размеры изображения. Вероятно, вы захотите сделать это пропорционально, то есть хотите сохранить одинаковое соотношение ширины и высоты, чтобы изображение не выглядело растянутым после повторной выборки. Также стоит отметить, изменение размера и повторная выборка различаются тем, что изменение размера не уделяет большого внимания контенту, что приводит к очень визуально-плохому изменению размеров изображений. Вы, вероятно, хотите передискретизировать.
В документации по PHP есть несколько отличных примеров на handling uploaded files, а также how to resize images с использованием библиотеки GDImage. Я предлагаю вам проверить их. Другие соответствующие методы, которые вы могли бы хотеть знать о:
- getimagesize() позволит вам проверить размеры изображения, не открывая его (полезно, чтобы проверить, если он должен быть изменен без загрузки его).
- imagesx() и imagesy() Размеры захвата ресурса изображения GD.
Благодарю вас за понимание. Я проверю эти методы. Я забыл упомянуть, что я использую jCrop и в основном передаю его функции, которая обрабатывает выходные данные всех видов. Но фотографии высокого разрешения меня озадачили. – wavyGravy
Вам может быть интересна эта страница их документов относительно масштабирования больших изображений: http://deepliquid.com/content/Jcrop_Sizing_Issues.html – coreyward
Очень интересно. Я буду помнить об этом. Спасибо, что нашли! – wavyGravy
Если вы уменьшаете ppi, размеры будут меняться в зависимости от уменьшения - меньше пикселей на дюйм означает, что на вашем снимке будет меньше дюймов.
Я хотел сказать разрешение, потому что я пытаюсь обнаружить, когда пользователь загружает рис с разрешением 300, но когда вы установите 72, изображение на самом деле мало. – wavyGravy
Это действительно так? Beacause Я читал, что ppi и dpi предназначены для печати и бесполезны на ПК. – Alex
@Alex при отображении изображения, ppi/dpi указывает качество изображения при просмотре на экране «100%» на экране. – blueberryfields
Если вы имеете дело с изображениями высокого разрешения, я бы спустился по пути 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();
Приятно, я читал, что воображение довольно надежное, поэтому я могу использовать этот метод, если все остальное не удастся. Спасибо огромное! – wavyGravy
Использование phpthumb (http://phpthumb.gxdlabs.com) является хорошим, элегантным и простым решением.
У меня есть пример рабочего кода с его загрузкой в GitHub. Он может использовать как GD & Imagemagick, это зависит от вас.
PPI, DPI ...
Во-первых, давайте уточнить терминологию. Оба PPI (пикселей на дюйм) и DPI (точка на дюйм) - это отношения, которые определяют преобразование пикселей в физические единицы (в этом случае дюйм). В цифровом мире - компьютеры, изображения, ... DPI ошибочно используется там, где PPI следует использовать вместо. DPI фактически существует только в мире печати. Но для нас сейчас, DPI = PPI.>> More info
Информация о разрешении (иногда упоминаемая как DPI, но это PPI) хранится в заголовках (метаданных изображения). JPG и PNG поддерживают это; но GIF doesn't support DPI - его нет в GIF header.
Изменение PPI в PHP
Итак, вы, вероятно, спрашиваете, как установить PPI (DPI) в заголовке изображения? В PHP, вы можете сделать это с помощью Imagick библиотеки (конечно, не для GIFs):
$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 для преобразования пикселей в целевую физическую единицу. Оба изображения будут напечатаны в разных размерах.
Image PPI не будет работать на веб
Плохая новость заключается в том, что это не изменит ничего при отображении изображения на веб-странице. anchor unit для отображения всегда является пикселем в CSS. Таким образом, img.jpg
и img-500dpi.jpg
будут иметь одинаковый размер в браузере. Даже если вы открываете изображения напрямую. Даже если вы используете физическую единицу, как cm
:
img { width: 8cm; height: 6cm; }
оба изображения будут отображаться в том же размере; физические единицы преобразуются в пиксели независимо от разрешения изображения, используя fixed ratio. И удивительно, даже если вы попытаетесь напечатать необработанные изображения (а не страницы) в Firefox, они оба будут напечатаны одинакового размера. Не могу комментировать другие браузеры. Достаточно странно - это работает в Ирфанвью.
PPI и сетчатка изображение
Теперь с Iphones и т.д. сетчатка (т.е. высокого разрешения) изображения становятся модными. Здесь много говорится о DPI (фактически, PPI), но все это связано только с целевым устройством и CSS media queries. Нет ничего, что бы действительно распознало ИЦП вашего изображения; вы должны указать фактические размеры изображения сетчатки высокого разрешения в пикселях. Это пример для 66x66 значка (from here):
@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
Так на самом деле, если вы хотите, чтобы загруженное изображение выглядит меньше «в Интернете», лучший способ это ресамплинг. Повторная выборка означает не изменять только заголовок, а изменять фактическую матрицу пикселей изображения. Вот код, который я использую в 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);
Имейте в виду, что это требует довольно много оперативной памяти, которая может быть ограничена вашим хостинг-провайдером.
BOOL Imagick :: setResolution (поплавок $ x_resolution, поплавок $ y_resolution)
https: // GitHub.com/simon-eQ/ImageUploader – samayo