[java] BufferedImage를 어떻게 복제합니까?

버퍼링 된 이미지가 많은 개체가 있습니다. 모든 버퍼링 된 이미지를 새 개체에 복사하는 새 개체를 만들고 싶지만 이러한 새 이미지가 변경 될 수 있으며 원본 개체 이미지가 새로운 개체 이미지.

그게 분명해?

이것이 가능합니까? 누구나 좋은 방법을 제안 할 수 있습니까? getSubImage를 생각했지만 하위 이미지의 변경 사항이 부모 이미지로 다시 반영된다는 것을 어딘가에서 읽었습니다.

BufferedImage의 완전히 별도의 복사본 또는 복제본을 얻을 수 있기를 원합니다.



답변

이 같은?

static BufferedImage deepCopy(BufferedImage bi) {
 ColorModel cm = bi.getColorModel();
 boolean isAlphaPremultiplied = cm.isAlphaPremultiplied();
 WritableRaster raster = bi.copyData(null);
 return new BufferedImage(cm, raster, isAlphaPremultiplied, null);
}


답변

나는 이것을한다:

public static BufferedImage copyImage(BufferedImage source){
    BufferedImage b = new BufferedImage(source.getWidth(), source.getHeight(), source.getType());
    Graphics g = b.getGraphics();
    g.drawImage(source, 0, 0, null);
    g.dispose();
    return b;
}

상당히 잘 작동하고 사용하기 쉽습니다.


답변

이전에 언급 한 절차는 서브 이미지에 적용 할 때 실패합니다. 다음은보다 완벽한 솔루션입니다.

public static BufferedImage deepCopy(BufferedImage bi) {
    ColorModel cm = bi.getColorModel();
    boolean isAlphaPremultiplied = cm.isAlphaPremultiplied();
    WritableRaster raster = bi.copyData(bi.getRaster().createCompatibleWritableRaster());
    return new BufferedImage(cm, raster, isAlphaPremultiplied, null);
}


답변

또 다른 방법은 Graphics2D클래스 를 사용하여 새 빈 이미지에 이미지를 그리는 것입니다. 이것은 실제로 이미지를 복제하지는 않지만 이미지 사본이 생성됩니다.

public static final BufferedImage clone(BufferedImage image) {
    BufferedImage clone = new BufferedImage(image.getWidth(),
            image.getHeight(), image.getType());
    Graphics2D g2d = clone.createGraphics();
    g2d.drawImage(image, 0, 0, null);
    g2d.dispose();
    return clone;
}


답변

BufferedImage 클래스는 Cloneable 인터페이스를 구현하지 않습니다. 따라서 복제 방법은 무시되지 않습니다. 다음은 딥 복사 기술의 대안입니다.
Java Tip 76 : 딥 복사 기술의 대안


답변

이 질문이 꽤 오래되었다는 것을 알고 있지만 향후 방문자를 위해 사용할 솔루션은 다음과 같습니다.

Image oldImage = getImage();
Image newImage = oldImage.getScaledInstance(oldImage.getWidth(null), oldImage.getHeight(null), Image.SCALE_DEFAULT);

방금 얻은 변경 newImage이 원본 이미지에도 영향을 미치는 경우 수정하십시오 .
-> getScaledInstance 용 Javadoc-
> SCALE_DEFAULT 용 Javadoc (다른 상수는 해당 상수 바로 아래에 나열됩니다)


답변