2011-01-21 3 views
8

Я обрабатываю изображения, когда пользователь загружает изображение, но моя проблема связана с высоким разрешением. Как вы обнаруживаете, когда пользователь ее загружает? Я использую библиотеку GD для PHP. Установка качества до 90 с помощью метода imagejpeg() ничего не делает с ним, но масштабирует измерение, а затем устанавливает ppi на 72. Я хочу иметь возможность сохранить измерение и одновременно отбросить ppi до 72. Любые советы будут очень признательны.Как изменить размер изображения с высоким разрешением с помощью PHP

+0

https: // GitHub.com/simon-eQ/ImageUploader – samayo

ответ

13

Нет такой вещи, как ИЦП, насколько это необходимо. Кроме того, DPI не существует в цифровом формате. Есть только пиксели и размеры (которые являются всего лишь измерением пикселей в любом направлении).

Что вы действительно пытаетесь сделать, это уменьшить изображение, уменьшив габаритные размеры изображения. Вероятно, вы захотите сделать это пропорционально, то есть хотите сохранить одинаковое соотношение ширины и высоты, чтобы изображение не выглядело растянутым после повторной выборки. Также стоит отметить, изменение размера и повторная выборка различаются тем, что изменение размера не уделяет большого внимания контенту, что приводит к очень визуально-плохому изменению размеров изображений. Вы, вероятно, хотите передискретизировать.

В документации по PHP есть несколько отличных примеров на handling uploaded files, а также how to resize images с использованием библиотеки GDImage. Я предлагаю вам проверить их. Другие соответствующие методы, которые вы могли бы хотеть знать о:

  • getimagesize() позволит вам проверить размеры изображения, не открывая его (полезно, чтобы проверить, если он должен быть изменен без загрузки его).
  • imagesx() и imagesy() Размеры захвата ресурса изображения GD.
+0

Благодарю вас за понимание. Я проверю эти методы. Я забыл упомянуть, что я использую jCrop и в основном передаю его функции, которая обрабатывает выходные данные всех видов. Но фотографии высокого разрешения меня озадачили. – wavyGravy

+0

Вам может быть интересна эта страница их документов относительно масштабирования больших изображений: http://deepliquid.com/content/Jcrop_Sizing_Issues.html – coreyward

+1

Очень интересно. Я буду помнить об этом. Спасибо, что нашли! – wavyGravy

0

Если вы уменьшаете ppi, размеры будут меняться в зависимости от уменьшения - меньше пикселей на дюйм означает, что на вашем снимке будет меньше дюймов.

+0

Я хотел сказать разрешение, потому что я пытаюсь обнаружить, когда пользователь загружает рис с разрешением 300, но когда вы установите 72, изображение на самом деле мало. – wavyGravy

+0

Это действительно так? Beacause Я читал, что ppi и dpi предназначены для печати и бесполезны на ПК. – Alex

+0

@Alex при отображении изображения, ppi/dpi указывает качество изображения при просмотре на экране «100%» на экране. – blueberryfields

1

Если вы имеете дело с изображениями высокого разрешения, я бы спустился по пути 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(); 
+0

Приятно, я читал, что воображение довольно надежное, поэтому я могу использовать этот метод, если все остальное не удастся. Спасибо огромное! – wavyGravy

12

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); 

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

1

BOOL Imagick :: setResolution (поплавок $ x_resolution, поплавок $ y_resolution)