подскажите, как вырезать середину изображения.

  • Автор темы Духовность™
  • Дата начала

Духовность™

Guest
Собственно задача - вырезать середину изображения из вертикального или горизонтального изображения любого размера. Полученное изображение должно быть 80х120. Естествено нужно соблюсти пропорции.

Не могу понять, как правильно создать алгоритм вычета области. Может кто-то реализовывал подобное?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Я вот думаю, что будет на этой маленькой превьюхе, если исходник размером етак 4288 x 2848.
Глаз человека?
 

Духовность™

Guest
Я вот думаю, что будет на этой маленькой превьюхе, если исходник размером етак 4288 x 2848.
Глаз человека?
4288 x 2848 - это горизонтальное изображение. Сначала уменьшить его до размера ?x120, а потом вырезать середину шириной 80 пикселов.
 

HraKK

Мудак
Команда форума
Духовность™, ты как всегда понял сарказм.
 

Духовность™

Guest
я сейчас вот так распознаю горизонтальное изображение и кроплю его:

PHP:
if ($this->actualWidth > $this->actualHeight)
{
	$width = floor($this->resizedHeight * $this->ratio);
			
	$thumbnailResource = imageCreateTrueColor($this->resizedWidth, $this->resizedHeight);

	imageCopyResampled(
		$thumbnailResource,
	        $this->getSourceImage(),
	        0, 0, // позиции х и у с которых начинать вставлять в принимающий прямоугольник
	        ($this->actualWidth - $width) / 2, 0, // позиции х и у с которых начинать отсчет считывания прямоугольника
	        $width, // ширина принимающего прямоугольника
	        $this->resizedHeight, // высота принимающего прямоугольника
	        $this->actualWidth, // ширина считываемого прямоугольника
	        $this->actualHeight // высота считываемого прямоугольника
	);
но данный алгоритм дает сбой - вертикальное горизонтальное изображение размером 500х499 дает белиберду.
 

HraKK

Мудак
Команда форума
Ты уже дважды не понял сарказм. Советую перечитать пост Mr_Maxа раза 5 до полного просвещения.
 

Духовность™

Guest
Ты уже дважды не понял сарказм. Советую перечитать пост Mr_Maxа раза 5 до полного просвещения.
о чем речь? горизонтальное изображение масштабируем по высоте и вырезаем середину. все нормально будет.
 

HraKK

Мудак
Команда форума
В том. что вырезая кусок из картинки 5000х4000 размером 120х80 ничего путного не получишь.
 

Духовность™

Guest
В том. что вырезая кусок из картинки 5000х4000 размером 120х80 ничего путного не получишь.
читаем внимательно что я пишу: горизонтальное изображение масштабируем по высоте и вырезаем середину. все нормально будет.
 

HraKK

Мудак
Команда форума
маштабируем? В задаче сказано вырезать середину, а ты вырежешь далеко не середину отмаштабировав до 120))
 

Духовность™

Guest
так как это сделать? вернее, реально ли это сделать без генерации темповых файлов?
 

HraKK

Мудак
Команда форума
Реально одно - узнать задачу, а не узнать постановку задачи)
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
fghbjhb
Еще один такой пост и будет р/о.
 

tz-lom

Продвинутый новичок
Духовность™
вообще мне казалось что когда ты в IMagick / GD явно говоришь "сделай мне канву 120х80" она резервируется на память и ничем не отличается от загруженной из файла,разве не так?
 

AmdY

Пью пиво
Команда форума
Духовность™
не надо резать середину общую, высчитаваешь отношение высоты оригинала в высоте нужного изображения, так же получаешь индекс для отношения ширины. выбрать меньши и отресазить картинку с учётом этого индекса. получается одна сторона нужного размера, другая забольшая. затем режем кусок, по одной оси у нас с размерами всё ок, для другой вырезаем с обрезая лишние отступы.

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

Semen

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

Активист

Активист
Команда форума
на GD, есть код, соглашусь, не хватает удобочитаемости (класс старый), но логика есть, ресайзит по max(x,y), либо кропити (т.е., сначала ресазит по min(x,y), потом атрезает ненужное), умеет работать с alfa каналом в gif/png, налаживать водяной знак.
Тут код: http://paste.netsago.org/ru/view/2401619637/

Сейчас есть специальный модуль, который использует jcrop вроде, и ratio, дабы не резать по середине а давать выбор клиенту. Один из его (модуля) классов, умеет работать с альфой.Nen
Тут код: http://paste.netsago.org/ru/view/1617686281/
 
Сверху