{% else-1 %}
Обновить | Подписаться | Поднять тему
Чтобы выполнить действие авторизируйтесь или пройдите регистрацию на сайте.
1. [автор] (1 май 2016, 06:37) [0/0] [0] [отв] [спам] [под] +1 | -1

Чтобы было понятно о чем речь, ниже прикреплен скрин.

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

Возможно ли на PHP определить на фото лицо пользователя?
Добавлено 01.05.16 в 06:38:31:
.....

Прикрепленные файлы:
* PROFIWM_COM_3539_1550713_Screenshot_2016-05-01-09-23-27.png (55.82 кб)
2. (1 май 2016, 06:55) [3/0] [3] [отв] [спам] [под] +1 | -1

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

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

Поэтому последовательность действий у меня следующая:

на временной картинке рисую те части, которые должны стать прозрачными в результате;

накладываю на исходное изображение;
по нужным координатам заполняю прозрачным цветом.
Чтобы прозрачность работала, у исходной картинки необходимо установить соответствующий флаг при помощи функции:
imagesavealpha($img_res, true);
, а вот наличие альфа канала у временного изображения не важно (я использовал true color, потому что в этом случае на один вызов функции imagecolortransparent() меньше).

Решение:
class ImgUtils
{
public static function imageToRes($img_file)
{
$img_res = false;

list($tmp, $tmp, $type) = getimagesize($img_file);

switch ($type)
{
case 2: // JPEG

$img_res = imagecreatefromjpeg($img_file);
break;

case 1: // GIF

$img_res = imagecreatefromgif($img_file);
break;

case 3: // PNG

$img_res = imagecreatefrompng($img_file);
break;
}

return $img_res;
}


public static function roundedCorners($img_res, $radius)
{
$width = imagesx($img_res);
$height = imagesy($img_res);

imagesavealpha($img_res, true);

// corners START
$img_tmp = imagecreate($width, $height);

$black = imagecolorallocate($img_tmp, 0, 0, 0);
$transp = imagecolorallocatealpha($img_tmp,
0, 0, 0, 127);

imagefill($img_tmp, $width / 2, $height / 2, $transp);

// left upper
imagearc($img_tmp, $radius / 2 - 1,
$radius / 2 - 1,
$radius,
$radius, 180, 270, $black);
imagefill($img_tmp, 0, 0, $black);
// right upper
imagearc($img_tmp, $width - $radius / 2,
$radius / 2 - 1,
$radius,
$radius, 270, 0, $black);
imagefill($img_tmp, $width - 1, 0, $black);
// right lower
imagearc($img_tmp, $width - $radius / 2,
$height - $radius / 2,
$radius,
$radius, 0, 90, $black);
imagefill($img_tmp, $width - 1, $height - 1, $black);
// left lower
imagearc($img_tmp, $radius / 2 - 1,
$height - $radius / 2,
$radius,
$radius, 90, 180, $black);
imagefill($img_tmp, 0, $height - 1, $black);

// corners END

imagecopyresampled($img_res, $img_tmp,
0, 0, 0, 0,
$width, $height, $width, $height);

$transp = imagecolorallocatealpha($img_res,
0, 0, 0, 127);
imagefill($img_res, 0, 0, $transp);
imagefill($img_res, $width - 1, 0, $transp);
imagefill($img_res, $width - 1, $height - 1, $transp);
imagefill($img_res, 0, $height - 1, $transp);

imagedestroy($img_tmp);

return $img_res;
}
}
Изначально я пытался нарисовать «уголки» на временном изображении при помощи одного прямоугольника и одного эллипса наложенного поверх. Оказалось что в таких условиях трудно контролировать радиусь углов — тогда я стал рисовать на каждый угол по своей окружности.


Изм. 1 раз. / Посл. изм. (1 май 2016, 06:56)
3. (1 май 2016, 07:10) [0/0] [0] [отв] [спам] [под] +1 | -1

Проще дать размер через css

У меня так

.ava{
width: 160px;
height: 160px;
border-radius: 50%;
}

И изображения норм

Прикрепленные файлы:
* PROFIWM_COM_1685_1550725_Screenshot_2016-05-01-10-10-03.png (165.43 кб)

Изм. 1 раз. / Посл. изм. (1 май 2016, 07:10)
4. [автор] (1 май 2016, 07:30) [0/0] [0] [отв] [спам] [под] +1 | -1
Korsakov,

Качество портится. Фото сжимается не пропорционально.

5.
BLVCK * 9.65
(1 май 2016, 09:15) [0/0] [0] [отв] [спам] [под] +1 | -1

Нужно чтобы скрипт обрезал фотографию и делал из нее квадрат, тогда и качество не меняется, да и растягиваний не будет *

6.
iNvAyT * 1.53
(1 май 2016, 09:34) [0/0] [0] [отв] [спам] [под] +1 | -1

В вк идет обрезка фото в квадратик определенного размера, див там в принципе такой же border-radius: 50% так что пиши, или ищи скрипт обрезки фото..

7. [автор] (1 май 2016, 09:42) [1/0] [1] [отв] [спам] [под] +1 | -1
BLVCK,

209х243 как из неё сделать 100х100 чтобы качество не изменилось? Я думаю, что никак, т.к PHP не сможет найти на фото определенный объект(лицо) и вырезать его.

Единственный здравомыслящий вариант, который я вижу, предложить пользователю самому из его фото вырезать нужную миниатюру.

8.
BLVCK * 9.65
(1 май 2016, 10:35) [0/0] [0] [отв] [спам] [под] +1 | -1

Денис Павлик, не нужно определять лицо. Пользователь загрузит фотографию, скрипт обрежет фотографию (до 100х100, например)и сделает квадрат. Увидят фотографию, поймут что лицо не вписывается и обрежут сами где-нибудь, а затем загрузят на сайт. *

9. [автор] (1 май 2016, 11:34) [0/0] [0] [отв] [спам] [под] +1 | -1
BLVCK,

Если резать квадрат 100х100 от центра, то где гарантия, что лицо пользователя будет находиться в центре, может оно где-то сбоку или лицо более 100х100 из-за большого формата фотографии?

А если просто сжимать большое фото в 100х100 то вот что получится
Добавлено 01.05.16 в 11:35:03:

Прикрепленные файлы:
* PROFIWM_COM_3539_1550779_OXe3IEEtQ54.jpg (37.87 кб)
* PROFIWM_COM_3539_1550779_mini_1462091384.jpg (2.1 кб)

Изм. 1 раз. / Посл. изм. (1 май 2016, 11:35)
10.
PIFAGOR * 0.11
(1 май 2016, 11:48) [0/0] [0] [отв] [спам] [под] +1 | -1

На фиере вроде похожая стоит чепуха... Особо не вникал но смысл тот же

Чтобы писать сообщения авторизируйтесь или пройдите регистрацию на сайте.
Подписаны: 1
Скачать тему | Файлы темы | Фильтр сообщений