Я хочу ограничить любые изображения, загруженные до соотношения сторон 1. Эти изображения также должны иметь минимальную высоту / ширину 600 пикселей. Моя проблема в том, что мой JavaScript cropper(slimimagecropper)
иногда создает изображения размером 599x600px или 598x600px. Чтобы решить эту проблему, я хотел позволить допуск + -3px.
Я проверяю соотношение сторон следующим образом:
if (abs(1 - ($image->width() / $image->height())) <= 0.009) { //... }
Но теперь, чем больше изображение (например, 700×700), тем больше допустимое отклонение (7px).
Кто-нибудь знает лучший способ проверить соотношение сторон?
Соотношение сторон 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 пикселя не сработала из-за округления.
Других решений пока нет …