2009-12-28 3 views
1

Я пытаюсь создать прозрачное изображение PNG из BufferedImage в Java.PNG прозрачность без альфа-канала

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

Это должно быть хорошо, потому что, согласно Chapter 8, section 5, part 4 of the PNG book, я могу добиться прозрачности, указав значение пикселя прозрачным. Это работает, создав заголовок tRNS в файле png.

Я не уверен, как перевести эту техническую информацию на Java-код. Само фактическое изображение является монохромным; каждый пиксель будет черным или белым. Я хотел бы заменить каждый белый пиксель прозрачным пикселем, не используя альфа-канал. Может кто-нибудь подтолкнет меня в правильном направлении?

ответ

2

Вы можете использовать следующий код.

Создать монохромную и прозрачный BufferedImage:

public static BufferedImage createTransparentMonochromeBufferedImage(int w, int h) 
{ 
    // The color map contains the colors black and white 
    byte[] cMap = {0, 0, 0, (byte)255, (byte)255, (byte)255}; 
    // Create an IndexColorModel setting white as the transparent color 
    IndexColorModel monochrome = new IndexColorModel(8, 2, cMap, 0, false, 1); 
    // Return a new BufferedImage using that color model 
    return new BufferedImage(w, h, BufferedImage.TYPE_BYTE_INDEXED, monochrome); 
} 

Сохраните BufferedImage в файле PNG:

public static void saveBufferedImageAsPNG(BufferedImage img, String filename) 
                  throws IOException{ 
    File file = new File(filename); 
    ImageIO.write(img, "png", file); 
} 
+0

Perfect. Я обнаружил, что документы API Java API недостаточно для этого класса. Может быть, я просто нуб. – 2009-12-28 20:10:07

-1

Я не знаю, но я уверен, что ответ находится в The png Specification. Надеюсь это поможет!

Нет ли библиотеки для java для написания файлов png (привязки java для libpng, возможно?), Которые сделают для вас тяжелую работу? (и, вероятно, сэкономит вам много головных болей, когда что-то не совсем работает)

+0

Я ценю ваш ответ, но я уже знаю, как это обрабатывается в PNG изображений , Я не уверен, как перевести это на Java-код. Я думаю, что это связано с ColorModel BufferedImage, но я не уверен, что один бит (каламбур?). Извините за любую недопонимание. – 2009-12-28 16:30:31

0

Я думаю, вы захотите использовать IndexColorModel: http://java.sun.com/j2se/1.4.2/docs/api/java/awt/image/IndexColorModel.html.

+0

Это подтверждает то, что я думал. Я читал и перечитывал эту ссылку в течение 2 дней. – 2009-12-28 16:50:23

+0

Итак, если вы уже знали, что используете IndexColorModel, и вы были/знаете о аргументах конструктора, в чем конкретно проблема? Вам нужно создать CM с соответствующим индексом, переданным как arg 'trans'. – prodigitalson

+0

Я не был уверен в использовании IndexColorModel, и даже сейчас, я не знаю, как его использовать. Однако эта ссылка выглядит многообещающей, http://mindprod.com/jgloss/indexcolormodel.html. Спасибо за ваше подтверждение, я отвечу в качестве ответа. – 2009-12-28 17:29:25

0

Попробуйте следующее:

  1. Узнайте индекс первого белого пиксела из BufferedImage.
  2. Создайте IndexColorModel с требуемыми параметрами.
  3. Создать ColorConvertOp. Вы можете передать null как аргумент RenderingHints.
  4. Используйте [ColorConvertOp.createCompatibleDestImage] [3] для получения нового экземпляра BufferedImage (место назначения).
  5. Используйте [ColorConvertOp.filter] [4] для выполнения преобразования из источника в пункт назначения.

Я не совсем уверен в этом, но ColorConvertOp кажется хорошей отправной точкой. Расскажите, как это получается!

[3]: http://java.sun.com/javase/6/docs/api/java/awt/image/ColorConvertOp.html#createCompatibleDestImage(java.awt.image.BufferedImage, java.awt.image.ColorModel) [4]: ​​http://java.sun.com/javase/6/docs/api/java/awt/image/ColorConvertOp.html#filter(java.awt.image.BufferedImage, java.awt.image.BufferedImage)

Смежные вопросы