java save - 어떻게 BufferedImage를 복제합니까?





get gettype (7)


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

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);
}

나는 많은 버퍼 이미지가있는 객체를 가지고 있는데, 새로운 객체를 생성하기를 원한다. 그러나 새로운 이미지는 변경 될 수 있으며, 원래의 객체 이미지가 새로운 개체 이미지.

그게 확실한가요?

이것이 가능한가요 누구든지 제발 할 수있는 좋은 방법을 제안 할 수 있습니까? 나는 getSubImage에 대해 생각해 보았지만 어딘가에서 하위 이미지에 대한 변경 사항이 부모 이미지로 되돌려 지도록 읽었습니다.

난 그냥 완전히 별도의 복사본이나 BufferedImage의 복제본을 얻을 수 있기를 원한다.




이것은 물건을 그리는 데 사용하는 프로그램에 매우 유용했으며 Stacks의 BufferedImages로 인해 실행 취소 / 다시 실행 상태를 구현할 수 없었습니다.

그런데, 나는 이런 종류의 작업을 위해 두 개의 스택을 사용하여 모든 방법을 제안합니다! 매번 작업을 수행 할 때마다 즉시 새 이미지를 만들고 위에서 언급 한 deepCopy 메서드를 사용하십시오.

image = deepCopy((BufferedImage) stackUndo.peek());

원하는대로 이미지를 변경 한 다음 편집을 중지하면 (마우스 버튼을 놓을 때처럼) do

stackUndo.push(image);                                                   

항상 왼쪽 스택의 상단에 요소를 칠합니다.

g.drawImage(stackUndo.peek(),x,y,null);

실행 취소 / 다시 실행 작업을 수행하는 경우 다음과 같이하십시오.

public void undoOrRedo(String op) {
    if(op.equals("undo") && stackUndo.size()>1){
       stackRedo.push(stackUndo.pop());
        repaint();
    }
    if(op.equals("redo") && stackRedo.size()>0){
        stackUndo.push(stackRedo.pop());
        repaint();
    }
}

왼쪽 스택에 항상 무언가를 남겨 두어야합니다. 그림을 그리기 위해 항상 맨 위에있는 요소 (엿보기)를 사용하기 때문입니다!




나는이 질문이 꽤 오래되었다는 것을 알고있다. 그러나 미래의 방문객들을 위해 내가 사용할 해결책이있다.

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

방금 얻은 newImage 변경해도 원본 이미지에 영향을 주면 나를 바로 잡으십시오.
getScaledInstance의 Javadoc
SCALE_DEFAULT의 Javadoc (그 외의 정수는 그 아래에 일람표되고 있습니다)




BufferedImage 클래스는 Cloneable 인터페이스를 구현하지 않습니다. 따라서 복제 메소드가 오버라이드되지 않습니다. 깊은 복사 기술의 대안은 다음과 같습니다. Java 팁 76 : 딥 복사 기술의 대안




나는 이것을한다:

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;
}

그것은 꽤 잘 작동하며 사용하기 쉽습니다.




또 다른 방법은 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;
}



용도:

minimum + rn.nextInt(maxValue - minvalue + 1)




java copy clone bufferedimage