PHP Загрузка изображений ограничивает форматное соотношение и разрешает только изображения с размерами & gt; = 600 пикселей

Я хочу ограничить любые изображения, загруженные до соотношения сторон 1. Эти изображения также должны иметь минимальную высоту / ширину 600 пикселей. Моя проблема в том, что мой JavaScript cropper(slimimagecropper) иногда создает изображения размером 599x600px или 598x600px. Чтобы решить эту проблему, я хотел позволить допуск + -3px.
Я проверяю соотношение сторон следующим образом:

if (abs(1 - ($image->width() / $image->height())) <= 0.009) { //... }

Но теперь, чем больше изображение (например, 700×700), тем больше допустимое отклонение (7px).

Кто-нибудь знает лучший способ проверить соотношение сторон?

1

Решение

Соотношение сторон 1: 1 означает, что ширина равна высоте. Итак, вы хотите проверить, превышает ли разница между шириной и высотой 3 пикселя. Проверка минимальных размеров будет отдельной проверкой.

Если вы хотите, чтобы также были коэффициенты, отличные от 1: 1, вам необходимо решить, где должна применяться разница. Например, для 4: 3 разница в высоте в 3 пикселя будет соответствовать разнице в ширине в 4 пикселя. Так что, если вы хотите быть снисходительным и допустить разницу в 3 пикселя на меньшем краю, вы должны написать что-то вроде

abs($img->width()*3/4 - $img->height()) <= 3

в то время как если вы хотите быть строгим и иметь порог в 3 пикселя на большем краю, вы должны написать

abs($img->width() - $img->height()*4/3) <= 3

Делать умножение перед делением (т.е. (height*4)/3 вместо height*(4/3) следует избегать некоторых неожиданностей, которыми может вас навязать арифметика с плавающей запятой, и сделать случай равенства немного более надежным. Если вы решили рассматривать соотношение сторон как одно число, имейте в виду, что, например, 4/3 не имеет точного представления в виде двоичного числа с плавающей запятой, поэтому ожидайте ошибок округления. Попробуйте изменить свой порог на 3.5 или же 3.1 или что-то еще, чтобы математически точная разница в 3 пикселя не сработала из-за округления.

0

Другие решения

Других решений пока нет …