2017-01-19 6 views
0

У меня есть 3 BufferedImages: A, C и D. Все изображения с цветами и альфа-каналом. С имеет альфа-над D, но с прозрачностью слоя A. Идея заключается в том, чтобы:BufferedImage set alpha from other BufferedImage

  • Установите альфа-канал C, что и A
  • Альфа над ними

I смешать альфа с new BufferedImage().createGraphics().drawImage(D).drawImage(C);. Но как установить альфа C?

Я открыт для любых предложений с использованием BufferedImage, но я бы предпочел те, которые не перебирают все пиксели, и делают вычисления вручную для повышения производительности (в надежде, что это так).

+0

Посмотрите похожие записи, как [этот] (http://stackoverflow.com/questions/660580/change-the-alpha-value-of-a-bufferedimage). –

ответ

0

Для изображения с равномерным альфа вы можете сделать следующее:

BufferedImage bim=null; 
try { 
    bim=ImageIO.read(new File("...")); 
} 
catch (Exception ex) { System.err.println("error in bim "+ex); } 
int wc=bim.getWidth(), hc=bim.getHeight(); 
    BufferedImage b=new BufferedImage(wc, hc, BufferedImage.TYPE_INT_ARGB); 
    b.getGraphics().drawImage(bim, 0, 0, null); 
    BufferedImage b2=new BufferedImage(wc, hc, BufferedImage.TYPE_INT_ARGB); 
    RescaleOp no=new RescaleOp(new float[]{1f, 1, 1, 1f}, new float[]{0, 0, 0, -50}, null); 
    b2=no.filter(b, null); 

    BufferedImage b3=new BufferedImage(wc, hc, BufferedImage.TYPE_INT_ARGB); 
    b3.getGraphics().drawImage(bim, 0, 0, null); 
    float offset=(b2.getRGB(0, 0)&0xff000000)>>24, a=(b3.getRGB(0, 0)&0xff000000)>>24; 
    no=new RescaleOp(new float[]{1, 1, 1, 1}, new float[]{0, 0, 0, -a+offset}, null); 
    b3=no.filter(b3, null); 

Теперь b3 имеет альфа b2.

Для изображения с неравномерной альфа вы должны работать на пиксель на пиксель.

+0

Что значит «однородная альфа»? Если это «альфа одинакова везде», это не так. – piegames

+0

да тогда пиксель за пикселем У меня нет другого выбора – gpasch

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