RMagick странный зеленый GIF при установке image_type - PullRequest
0 голосов
/ 15 июля 2011

Итак, я получил следующий код, пытаясь преобразовать png в gif в ruby, используя RMagick, но получил некоторые странные зеленые элементы в некоторой части изображения.

require 'RMagick'
include Magick
img = Magick::Image.read(pngPath.open).first
//if comment out the following line, there is no problem
img.image_type=PaletteMatteType
img.transparent("#00FF00")
img.write(gifPath)

PS: как изменить глубину на 8 или 16 и Как изменить цвет на 256? По умолчанию для глубины и цвета 8 и 256 правильно?

Ответы [ 2 ]

2 голосов
/ 15 июля 2011

Большинство методов RMagick возвращают новое изображение вместо , изменяя его на месте;некоторые методы имеют версии ! для изменения вещей (например, scale и scale!), но некоторые этого не делают (например, quantize).

В частности, transparent возвращает новое изображение:

img.transparent(color, opacity=TransparentOpacity) -> image
[...]
Возвращает
Новое изображение

Итак, просто сказав, img.transparent("#00FF00") создает новое изображение с желаемой прозрачностью, а затем выбрасывает его, потому что вы игнорируете возвращаемое значение.

Кроме того, обычный способ поместить что-то в меньшую палитру - это использовать quantize.

Я думаю, вы хотите что-то вроде этого:

img = Magick::Image.read(pngPath.open).first
img = img.transparent('#00FF00')
img = img.quantize(256)
img.write(gifPath)

у меня работает как минимум.

0 голосов
/ 15 июля 2011

Не уверен насчет значений по умолчанию, я бы изменил пару вещей:

, если вам нужен RMagick, нет необходимости включать Magick впоследствии, я думаю, вы можете удалить эту строку.* Константы должны начинаться с префикса Magick ::, поэтому, вероятно, оно должно быть Magick::PaletteMatteType

прозрачный метод принимает 2 аргумента, первый - цвет, который вы хотите сделать прозрачным, а второй -прозрачности.Я думаю, что Gif знает только один вид, но в любом случае, попробуйте

img.transparent("#00FF00", Magick::TransparentOpacity)
...