Преобразование изображений png с прозрачностью в jpg портит изображение

Я пытаюсь преобразовать любое изображение, загружаемое пользователем, в формат jpg с белым фоном. Однако я заметил, что когда пользователь загружает изображение PNG, которое содержит прозрачность, ColdFusion разрушает все изображение. Похоже, что происходит цифровая коррупция.

Таким образом, пользователь сначала предоставляет URL-адрес, по которому находится изображение, и cfhttp используется для его чтения:

<cfhttp url="http://pathtoimage/image.png" method="get" useragent="#CGI.http_user_agent#" getasbinary="yes" result="PageResult">
<cfimage name="UserImg" source="#PageResult.FileContent#" />

Итак, теперь UserImg - это изображение, которое пользователь хочет загрузить. Затем мы делаем обычную установку сглаживания, и я также хочу, чтобы фон был белым, потому что изображение может иметь прозрачный фон:

<cfset ImageSetAntialiasing(UserImg, "on")>
<cfset ImageSetBackgroundColor(UserImg, "white")>

Последний этап - записать его на сервер как файл jpg:

<cfimage source="#UserImg#" action="write" destination="pathtoimages/userimage.jpg" overwrite="yes" format="jpg" />

Проблема в том, что PNG-изображения с прозрачностью полностью испорчены. То, что должно иметь белый фон и быть четким изображением в формате jpg, в конечном итоге оказывается блочным с черным фоном. Вот пример:

Исходное изображение:  исходное изображение png

После преобразования jpg:  преобразовано в изображение jpg

Как мне обойти это?


person volume one    schedule 26.01.2016    source источник
comment
Какую версию ColdFusion вы используете? Вы уверены, что он поддерживает это преобразование?   -  person James A Mohler    schedule 27.01.2016
comment
ColdFusion 11. Ответ Ли сработал.   -  person volume one    schedule 27.01.2016


Ответы (1)


ImageSetBackgroundColor не действует в этом коде. В документации это:

Устанавливает цвет фона для изображения ColdFusion. Цвет фона используется для очистки области. Установка цвета фона влияет только на последующие вызовы ImageClearRect.

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

Вместо этого попробуйте вставить прозрачный PNG в новое изображение с белым фоном. Затем выполните преобразование на новом изображении.

<!--- use "rgb" to make background opaque --->
<cfset UserImgCopy = ImageNew("", UserImg.Width, UserImg.Height, "rgb", "white")>
<cfset ImagePaste(UserImgCopy, UserImg, 0, 0)>
<cfset ImageWrite(UserImgCopy, "c:\path\userimage.jpg", true)>
person Leigh    schedule 26.01.2016
comment
Просто великолепно. Сработало именно так, как я хотел, спасибо Ли :) - person volume one; 27.01.2016
comment
Добро пожаловать :) Рад, что помог. - person Leigh; 27.01.2016
comment
У меня были проблемы с изображениями, которые были слишком большими для ColdFusion для обработки в памяти (ошибка кучи Java). Я использую GraphicsMagick (бесплатно) с ColdFusion 8-11, а синтаксис командной строки для преобразования PNG в JPG с использованием белого фона - gm convert -transparent white -extent 0x0 #PNGPathIn# #JPGPathOut#. - person James Moberg; 27.01.2016
comment
Да, CF / java не всегда лучший инструмент для обработки изображений, учитывая, насколько интенсивным он может быть. - person Leigh; 27.01.2016