2013-05-31 3 views
0

나는 나의 현재 구현은 분명하지만, 매우 느리게하는 VolatileImage자바 반전 이미지 알파

의 알파 채널을 반전해야 할 상황이있다;

public BufferedImage invertImage(VolatileImage v) { 
    BufferedImage b = new BufferedImage(v.getWidth(), v.getHeight(), BufferedImage.TYPE_4BYTE_ABGR); 
    Graphics g = b.getGraphics(); 
    g.drawImage(v, 0, 0, null); 
    for(int i = 0; i < b.getWidth(); i++) { 
     for(int(j = 0; j < b.getHeight(); j++) { 
      Color c = new Color(b.getRGB(i, j, true)); 
      c = new Color(c.getRed(), c.getGreen(), c.getBlue(), 255 - c.getAlpha()); 
      b.setRGB(i, j, c.getRGB()); 
     } 
    } 
    return b; 
} 

이 작업은 정상적으로 수행되지만 속도가 느립니다. 나는 큰 이미지를 가지고 있으며 이것을 빨리해야한다. 나는 AlphaComposite으로 주위를 어지럽 혔지만 아무 소용이 없다 - 이것은 정말로 내가 이해하는 한 퇴비화하는 문제가 아니다.

255 - x0 <= x < 256에 대해 x & 0xff과 같으면 어떻게 든 알파 채널을 통해 XOR 할 수 있습니까?

+0

아마도 'IntBuffer'를 래핑하고 각'int'를 처리할까요? – fge

답변

1

당신은 모든 getter와 루프 내부의 생성자 방지하여 속도를 할 수 있어야한다 : googleing의 많은 후

for(int i = 0; i < b.getWidth(); i++) { 
    for(int(j = 0; j < b.getHeight(); j++) { 
     b.setRGB(b.getRGB(i, j)^0xFF000000); 
    } 
} 
+0

지금 막이 작업을하고 있었습니까? P 얼마나 빨라 졌는지 봅시다. – lynks

+0

@Joni 좋은 지적, 업데이트 ... – jazzbassrob

+0

루프 내용을'b.setRGB (i, j, b.getRGB (i, j)^0xff000000);하지만 여전히 매우 느립니다. 이 XOR을 RGB 값의 배열에 적용 할 수 있습니까? 또는 한 번에 전체 이미지? – lynks

1

, 나는 BufferedImages에지도로 사용되는 DataBuffer 클래스 건너 온 :

DataBufferByte buf = (DataBufferByte)b.getRaster().getDataBuffer(); 
byte[] values = buf.getData(); 
for(int i = 0; i < values.length; i += 4) values[i] = (byte)(values[i]^0xff); 

이 값은 BufferedImage의 값을 반전합니다 (다시 그릴 필요가 없습니다. 배열 값을 변경하면 버퍼링 된 이미지 자체가 변경됩니다).

내 테스트에 따르면이 방법은 jazzbassrob의 개선보다 약 20 배 빠르며 원래 방법보다 약 1.5 배 빠릅니다.