버퍼링 된 이미지가 많은 개체가 있습니다. 모든 버퍼링 된 이미지를 새 개체에 복사하는 새 개체를 만들고 싶지만 이러한 새 이미지가 변경 될 수 있으며 원본 개체 이미지가 새로운 개체 이미지.
그게 분명해?
이것이 가능합니까? 누구나 좋은 방법을 제안 할 수 있습니까? 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 (다른 상수는 해당 상수 바로 아래에 나열됩니다)