
Рисуем компас на PHP

Рисуем компас на PHP
Появилась следующая задача. Есть пачка изображений, каждому изображению соответствует определенное направление съемки. Требуется промаркировать все изображения картинкой компаса, который указывает это направление. С самой маркировкой проблем не возникло, а вот с компасами пришлось немного повозиться.
Самое простое решение задачи - поворот изображения компаса на нужный угол при помощи стандартной функции ImageRotate. Но готовый результат при этом получается, мягко говоря, неудовлетворительный. Так как на изображении компаса присутствуют надписи с обозначениями сторон света, то при повороте на большие углы они становятся трудночитаемыми. Несколько таких убожеств вы можете видеть на картинке ниже.

Простой поворот изображения
Для достижения правильного результата надо сделать следующее. На исходном изображении компаса отмечаются координаты, по которым должны находиться надписи, а сами надписи с изображения удаляются в графическом редакторе. При обработке изображение компаса поворачивается на нужный угол, а затем на него уже наносятся надписи скриптом. Новые координаты для каждой надписи считаются по формуле из школьного курса геометрии.
Code (PHP) : Убрать нумерацию
- // Файл с изображением компаса
- $im=ImageCreateFromPNG('compass.png');
- // Размеры изображения
- $img_width=ImageSX($im);
- $img_height=ImageSY($im);
- // Отступ текста
- $padding=25;
- // Название и размер шрифта
- $font_name='arialbd.ttf';
- $font_size=24;
- // Угол поворота компаса по часовой стрелке
- $angle=25;
- // Координаты и текст надписей
- $coords=array(
- array(
- 'x'=>intval($img_width/2),
- 'y'=>$padding,
- 'txt'=>'N'
- ),
- array(
- 'x'=>($img_width-$padding),
- 'y'=>intval($img_height/2),
- 'txt'=>'E'
- ),
- array(
- 'x'=>intval($img_width/2),
- 'y'=>($img_height-$padding),
- 'txt'=>'S'
- ),
- array(
- 'x'=>$padding,
- 'y'=>intval($img_height/2),
- 'txt'=>'W'
- ),
- );
- // Цвет фона для поворота
- $back_color=ImageColorAllocate($im, 255,255,255);
- // Повернуть компас на заданный угол
- $rotation=ImageRotate($im,(360-$angle),$back_color);
- // Цвет текста для надписей
- $text_color=ImageColorAllocate($rotation, 0,0,0);
- // Размеры получившегося изображения
- $n_width=ImageSX($rotation);
- $n_height=ImageSY($rotation);
- foreach($coords as $data) {
- // Угол поворота в радианах
- $rad=deg2rad($angle);
- // Координаты центра изображения
- $dx=$img_width/2;
- $dy=$img_height/2;
- $new_x=$dx+($data['x']-$dx)*cos($rad)-($data['y']-$dy)*sin($rad);
- $new_y=$dy+($data['x']-$dx)*sin($rad)+($data['y']-$dy)*cos($rad);
- // Корректировка координат под размер нового изображения
- $new_x+=intval(($n_width-$img_width)/2);
- $new_y+=intval(($n_height-$img_height)/2);
- // Корректировка координат с учетом размера символов
- $tmpx=ImageTTFBBox($font_size,0,$font_name,$data['txt']);
- $fx=intval(($tmpx[2]-$tmpx[0])/2);
- $new_x-=$fx;
- $fy=intval(($tmpx[7]-$tmpx[1])/2);
- $new_y-=$fy;
- // Нанести текст на изображение
- ImageTTFText($rotation,$font_size,0,
- $new_x,$new_y,$text_color,$font_name,$data['txt']
- );
- }
- // Обрезать изображение компаса под оригинальные размеры
- ImageCopy($im,$rotation,0,0,
- intval(($n_width-$img_width)/2),
- intval(($n_height-$img_height)/2),
- $img_width,$img_height
- );
- // Вывести в браузер
- header("Content-type: image/jpeg");
- ImageJPEG($im,NULL,100);
- // Прибраться за собой
- ImageDestroy($im);
- ImageDestroy($rotation);

Поворот изображения с нанесением текста
Как вы можете видеть, результат выглядит гораздо лучше. Все обозначения сторон света находятся на своих местах, при этом оставаясь читаемыми. По этому же принципу можно не только рисовать компас, но и обрабатывать другие изображения, где используется поворот и нанесение каких-либо текстовых элементов на его участки.
Просмотров: 862 | Комментариев: 4

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(20.10.2022 в 16:21):
Нет. Воровская звезда восьмиконечная, с лучами одинаковой длины.

Ellephant
(20.10.2022 в 08:09):
Так может воровская звезда это и есть компас?! Символизирует типа "я свободен как ветер"! Ну а компАс назвать вроде не по фене, вот и назвали звезда. Это моя версия, если что. ;)

ManHunter
(15.10.2022 в 11:31):
Как говорил дедушка Фрейд, иногда сигара - это просто сигара.

OggO
(15.10.2022 в 09:16):
Получилась звезда воровская)))
Огуречек огуречек - получился человечек)
Огуречек огуречек - получился человечек)

Добавить комментарий
Заполните форму для добавления комментария
