imagerotate меняет цвет исходного изображения

Я сталкиваюсь с очень странным поведением при вращении изображений с помощью PHP. Исходное изображение изменяется во время вращения. В качестве примера, вот изображения бок о бок. Это трудно увидеть, но если вы присмотритесь, белая область вокруг ножа изменится с #FFFFFF на #FDFDFD.

введите здесь описание изображения

Я использую imagerotate без указания параметров, однако, если я попытаюсь сделать то же самое с черным цветом фона, я получу повернутое изображение с черной «заливкой», но белая часть изображения по-прежнему изменится с #FFFFFF на #FDFDFD . Я сбит с толку. Это похоже на то, как PHP "округляет" цвета.

введите здесь описание изображения

исходное изображение: https://i.imgur.com/iYwvxAE.jpg

повернутое изображение: https://i.imgur.com/0lXXuO6.jpg

редактировать:

вот мой код

$img = imagecreatefromjpeg($localFile);
$img = imagerotate($img, 45, 0);
imagejpeg($img, '/tmp/a.jpg');

person Steven Musumeche    schedule 09.03.2015    source источник
comment
Можете ли вы опубликовать ссылку imgur на исходное изображение и код, который вы используете для поворота? Я хотел бы увидеть, получу ли я те же результаты.   -  person Matt    schedule 09.03.2015
comment
исходное изображение: i.imgur.com/iYwvxAE.jpg повернутое изображение: i.imgur.com/0lXXuO6.jpg   -  person Steven Musumeche    schedule 09.03.2015
comment
Из любопытства, если вы попробуете то же самое с PNG, вы получите те же результаты?   -  person Matt    schedule 09.03.2015
comment
те же результаты при повороте PNG и сохранении в JPG. Я не пробовал сохранять в PNG.   -  person Steven Musumeche    schedule 09.03.2015
comment
Мне было бы любопытно, если бы при сохранении в PNG не было проблемы, при этом одним из возможных решений (но не обязательно отличным) было бы найти #fdfdfd и заменить его на #ffffff. $index = imagecolorclosest ($im, 253, 253, 253); imagecolorset($im, $index, 255, 255, 255);   -  person Matt    schedule 09.03.2015
comment
Я попытался сохранить в PNG и столкнулся с той же проблемой.   -  person Steven Musumeche    schedule 09.03.2015
comment
вы смогли воспроизвести с оригинальными изображениями?   -  person Steven Musumeche    schedule 09.03.2015
comment
Еще нет, не могли бы вы опубликовать код, который вы используете? Какую версию gd вы используете? Вы можете использовать это, чтобы узнать: var_dump(gd_info());   -  person Matt    schedule 09.03.2015
comment
2.1.1 с PHP 5.6.6   -  person Steven Musumeche    schedule 09.03.2015
comment
Я только что обновил свой вопрос с кодом   -  person Steven Musumeche    schedule 09.03.2015
comment
У меня точно такая же проблема с использованием вашего примера изображения. Дайте мне несколько минут, чтобы поиграть с этим.   -  person Matt    schedule 09.03.2015


Ответы (1)


Я понял! В документе php для поворота изображения (http://php.net/manual/en/function.imagerotate.php) я заметил

«Примечание: на эту функцию влияет метод интерполяции, заданный функцией imagesetinterpolation()».

Затем я попробовал несколько различных алгоритмов интерполяции. IMG_BELL, похоже, сохраняет белый цвет.

<?php
function LoadJpeg($imgname)
{
    $im = imagecreatefromjpeg($imgname);
    imagesetinterpolation($im, IMG_BELL);
    $im = imagerotate($im, 45, 0);
    return $im;
}

$img = LoadJpeg('test.jpg');

imagejpeg($img, 'C:\temp\a.jpg', 100);
imagedestroy($img);
person Matt    schedule 09.03.2015
comment
Кажется, я получаю лучшие результаты, используя IMG_BICUBIC, но спасибо, что указали мне правильное направление, это решает проблему. - person Steven Musumeche; 10.03.2015
comment
В моем случае это уничтожает цвет и форму текста. - person Veshraj Joshi; 03.11.2017