CImageHandler - работа с изображениями
Re: CImageHandler - работа с изображениями
wa1demar где добавлять код использования компонента зависит от логики вашего приложения, Вам, скорей всего, нужно добавить его в экшн, но точно не в behaviors. Компонент с базой не работает, Вам необходимо реализовать обновление базы самостоятельно. Имя файла можно задать в методе save(), либо оставить пустым и тогда оригинальный файл будет затерт (в ридми это указанно).
Re: CImageHandler - работа с изображениями
Здравствуйте! Во-первых огромное спасибо за Ваш труд, обыскался быстрое расширение для работы с изображениями да ещё и с возможностью вотермарков!
Попробовал Ваше, быстро и просто.
Но возникло затруднение с вотермарками, у меня лежит вотермарк в конкретном(большом - логотип) разрешении, а по сайту используются и создаются изображения различного разрешения и держать под каждое из них свой вотермарк трудоёмко и глупо. Поэтому предлагаю немного расширить функционал в отношении вотермарков и добавить пару параметров. Не судите строго я не профессионал, любой критике буду рад, вот что получилось:
Моё творчество неоттабулированно. Как видно из названий переменных $autoZoom - это указание на автоматический ресайз под итоговое изображение, а $zoomPercent - это количество процентов от ширины нового изображения, которое и определяет размер вотермарка после его ресайза(вотермарк ресайзится пропорционально).
Попробовал Ваше, быстро и просто.
Но возникло затруднение с вотермарками, у меня лежит вотермарк в конкретном(большом - логотип) разрешении, а по сайту используются и создаются изображения различного разрешения и держать под каждое из них свой вотермарк трудоёмко и глупо. Поэтому предлагаю немного расширить функционал в отношении вотермарков и добавить пару параметров. Не судите строго я не профессионал, любой критике буду рад, вот что получилось:
Код: Выделить всё
public function watermark($watermarkFile, $offsetX, $offsetY, $corner = self::CORNER_RIGHT_BOTTOM, $autoZoom = true, $zoomPercent = 30)
{
$this->checkLoaded();
if ($wImg = $this->loadImage($watermarkFile))
{
$posX = 0;
$posY = 0;
if ($autoZoom)
{
$oldwImgWidth = $wImg['width'];
$oldwImgHeight = $wImg['height'];
$wImg['width'] = floor($this->width * $zoomPercent / 100);
$wImg['height'] = floor($wImg['width'] * $oldwImgHeight / $oldwImgWidth);
}
switch ($corner)
{
case self::CORNER_LEFT_TOP:
$posX = $offsetX;
$posY = $offsetY;
break;
case self::CORNER_RIGHT_TOP:
$posX = $this->width - $wImg['width'] - $offsetX;
$posY = $offsetY;
break;
case self::CORNER_LEFT_BOTTOM:
$posX = $offsetX;
$posY = $this->height - $wImg['height'] - $offsetY;
break;
case self::CORNER_RIGHT_BOTTOM:
$posX = $this->width - $wImg['width'] - $offsetX;
$posY = $this->height - $wImg['height'] - $offsetY;
break;
case self::CORNER_CENTER:
$posX = floor(($this->width - $wImg['width']) / 2);
$posY = floor(($this->height - $wImg['height']) / 2);
break;
default:
throw new Exception('Invalid $corner value');
}
if($autoZoom)
{
imagecopyresampled($this->image, $wImg['image'], $posX, $posY, 0, 0, $wImg['width'], $wImg['height'], $oldwImgWidth, $oldwImgHeight);
}
else
{
imagecopy($this->image, $wImg['image'], $posX, $posY, 0, 0, $wImg['width'], $wImg['height']);
}
imagedestroy($wImg['image']);
return $this;
}
else
{
return false;
}
}
Re: CImageHandler - работа с изображениями
oki84 спасибо! обновил компонент.
Re: CImageHandler - работа с изображениями
сегодня столкнулся с такой вот ерундой...наложил watermark
в чем проблема?
извиняюсь за слона
самое интересное, что такое случается только тогда, когда точка наложения - темная (серая\черная)
если в этой точке другие цвета - всё отлично накладывается
в чем проблема?
извиняюсь за слона
самое интересное, что такое случается только тогда, когда точка наложения - темная (серая\черная)
если в этой точке другие цвета - всё отлично накладывается
Re: CImageHandler - работа с изображениями
частично убираются артефакты путем добавления $this->preserveTransparency($wImg['image']);
но всё равно не полностью
но всё равно не полностью
Код: Выделить всё
public function watermark($watermarkFile, $offsetX, $offsetY, $corner = self::CORNER_RIGHT_BOTTOM, $zoom = false)
{
$this->checkLoaded();
if ($wImg = $this->loadImage($watermarkFile))
{
$posX = 0;
$posY = 0;
$watermarkWidth = $wImg['width'];
$watermarkHeight = $wImg['height'];
if($zoom !== false)
{
$dimension = round(max($this->width, $this->height) * $zoom);
$watermarkHeight = $dimension;
$watermarkWidth = round($watermarkHeight / $wImg['height'] * $wImg['width']);
if($watermarkWidth > $dimension)
{
$watermarkWidth = $dimension;
$watermarkHeight = round($watermarkWidth / $wImg['width'] * $wImg['height']);
}
}
switch ($corner)
{
case self::CORNER_LEFT_TOP:
$posX = $offsetX;
$posY = $offsetY;
break;
case self::CORNER_RIGHT_TOP:
$posX = $this->width - $watermarkWidth - $offsetX;
$posY = $offsetY;
break;
case self::CORNER_LEFT_BOTTOM:
$posX = $offsetX;
$posY = $this->height - $watermarkHeight - $offsetY;
break;
case self::CORNER_RIGHT_BOTTOM:
$posX = $this->width - $watermarkWidth - $offsetX;
$posY = $this->height - $watermarkHeight - $offsetY;
break;
case self::CORNER_CENTER:
$posX = floor(($this->width - $watermarkWidth) / 2);
$posY = floor(($this->height - $watermarkHeight) / 2);
break;
default:
throw new Exception('Invalid $corner value');
}
$this->preserveTransparency($wImg['image']);
imagecopyresampled(
$this->image,
$wImg['image'],
$posX,
$posY,
0,
0,
$watermarkWidth,
$watermarkHeight,
$wImg['width'],
$wImg['height']
);
imagedestroy($wImg['image']);
return $this;
}
else
{
return false;
}
}
Re: CImageHandler - работа с изображениями
попробуйте изменить следующее свойство
если не помогает, мне нужны будут оригиналы изображений, чтобы воссоздать проблему
Код: Выделить всё
public $transparencyColor = array(0, 0, 0);
Re: CImageHandler - работа с изображениями
Проблема с прозрачным фоном наблюдается при наложении водяного знакак на изображение формата .png
Re: CImageHandler - работа с изображениями
Нужны обе картинки (изображение и вотермарк) для воссоздания проблемы. Можно в личные сообщения.
Re: CImageHandler - работа с изображениями
Фиксил проблему в одном проекте, правда уже не помню что и как, такой метод должен работать:
Код: Выделить всё
public function watermark($watermarkFile, $offsetX, $offsetY, $corner = self::CORNER_RIGHT_BOTTOM)
{
$this->checkLoaded();
if ($wImg = $this->loadImage($watermarkFile))
{
$posX = 0;
$posY = 0;
switch ($corner)
{
case self::CORNER_LEFT_TOP:
$posX = $offsetX;
$posY = $offsetY;
break;
case self::CORNER_RIGHT_TOP:
$posX = $this->width - $wImg['width'] - $offsetX;
$posY = $offsetY;
break;
case self::CORNER_LEFT_BOTTOM:
$posX = $offsetX;
$posY = $this->height - $wImg['height'] - $offsetY;
break;
case self::CORNER_RIGHT_BOTTOM:
$posX = $this->width - $wImg['width'] - $offsetX;
$posY = $this->height - $wImg['height'] - $offsetY;
break;
case self::CORNER_CENTER:
$posX = floor(($this->width - $wImg['width']) / 2);
$posY = floor(($this->height - $wImg['height']) / 2);
break;
default:
throw new Exception('Invalid $corner value');
}
$trans = imagecolorallocate($wImg['image'], 0, 0, 0);
imagecolortransparent($wImg['image'],$trans);
$newImage = imagecreatetruecolor($this->width, $this->height);
imagecopy($newImage, $this->image, 0, 0, 0, 0, $this->width, $this->height);
$this->image = $newImage;
imagecopy($this->image, $wImg['image'], $posX, $posY, 0, 0, $wImg['width'], $wImg['height']);
imagedestroy($wImg['image']);
return $this;
}
else
{
return false;
}
}
Re: CImageHandler - работа с изображениями
YunX Протестировал различные комбинации форматов JPEG, GIF и PNG. Проблемы наблюдаются только при наложении GIF на PNG, PNG на GIF и JPEG на GIF, пока не придумал как это фиксить (скорей всего GIF надо будет приводить к PNG для сохранения прозрачности и цветов, плюс сохранять надо будет тоже в PNG). Вряд ли кому-то придется использовать указанные комбинации изображений, но попробую найти решение проблемы, т.к. пока руки не доходят написать ImageMagic версию (теоретически там таких проблем не должно быть).
Если у вас наблюдаются проблемы наложения других форматов, то убедитесь, что вы используете последнюю версию компонента и отправьте мне обе картинки для воссоздания проблемы.
Если у вас наблюдаются проблемы наложения других форматов, то убедитесь, что вы используете последнюю версию компонента и отправьте мне обе картинки для воссоздания проблемы.
Re: CImageHandler - работа с изображениями
d4rkr00t Спасибо, посмотрю ваш код.
Re: CImageHandler - работа с изображениями
Спасибо за полезный компонент!
Сделал pull-request:
1) добавил дополнительные позиции для водяного знака и текста;
2) добавил alpha для метода text(), т.е. текст теперь можно выводить с различный уровнем прозрачности (0 - обычный, 127 - полностью прозрачный);
Думаю полезные будут фичи для нанесения ватермарков.
Сделал pull-request:
1) добавил дополнительные позиции для водяного знака и текста;
2) добавил alpha для метода text(), т.е. текст теперь можно выводить с различный уровнем прозрачности (0 - обычный, 127 - полностью прозрачный);
Думаю полезные будут фичи для нанесения ватермарков.
Разработка на Yii: monoray.ru
Открытое бесплатное решение для создания сайтов по аренде/продаже недвижимости: Open Real Estate
Открытое бесплатное решение для создания сайтов по аренде/продаже недвижимости: Open Real Estate
Re: CImageHandler - работа с изображениями
Большое спасибо! Обновил код.
Re: CImageHandler - работа с изображениями
Tokolist, Вы прелесть) Только собрался писать компонент, случайно наткнулся на Ваш. Оказалось, все уже написано до нас, что нужно) Спасибо.
Re: CImageHandler - работа с изображениями
Хотелось бы узнать. Когда вы примерно собираетесь сделать это? Думаю сам писать, но может и нет смысла спешить =).Tokolist писал(а): В планах на будущее:
3. обертка над ImageMagic, с возможностью переключения между GD и ImageMagic (хотя не уверен что есть такая необходимость)
А насчет необходимости могу отметить как раз, что есть ситуации, при которых это нужно.
У меня такая ситуация сложилась: GD почему-то выдает после кропа или ресайза другие цвета. ImageMagick такого, почему-то не делает - никаких проблем. + проблема с загрузкой больших файлов на ImageMagick как-то проще решается =).
Re: CImageHandler - работа с изображениями
На данный момент, к сожалению, нету времени развивать компонент и пока не знаю когда появится. По сути все что есть это пункт в TODO и некоторые наброски структуры, которые не вижу смысла выкладывать.
Если напишете аналог на ImageMagic, будет здорово объединить наши коды в один продукт.
Если напишете аналог на ImageMagic, будет здорово объединить наши коды в один продукт.
Re: CImageHandler - работа с изображениями
Подскажите, есть ли возможность найти на чёрно-белой картинке (схеме) КООРДИНАТЫ определённого текста? Какими средствами, это можно сделать?
Re: CImageHandler - работа с изображениями
Сделал pull-request:
добавил поддержку ImageMagick
добавил поддержку ImageMagick
Re: CImageHandler - работа с изображениями
kosenka Большое спасибо! Посмотрю в ближайшее время.
Re: CImageHandler - работа с изображениями
kosenka, еще раз спасибо за код. это хороший пинок мне чтобы допилить компонент создал отдельную ветку в репозитории, т.к. есть несколько идей по улучшению кода.