2012-01-14 31 views
6

Tôi có một hình ảnh. Tôi cần tạo một bản sao chính xác của nó và lưu nó vào BufferedImage, nhưng không có Image.clone(). Điều cần được bên trong một vòng lặp tính toán và vì vậy nó phải được thực sự nhanh chóng, không có sao chép pixel-by-pixel. Phương pháp perfomance tốt nhất để làm điều này là gì?Làm thế nào để sao chép hình ảnh?

+1

Hãy xem http://stackoverflow.com/questions/3514158/how-do-you-clone-a-bufferedimage – user219882

+1

Bản sao này pixel theo pixel -pixel (chỉ sao chép dữ liệu raster). Có cách nào để làm nhanh hơn không? – Cenius

+0

Nếu bạn muốn có một bản sao sâu, không có cách nào khác mà tôi biết. Và tại sao bạn muốn sao chép nó mỗi vòng lặp lặp lại? – user219882

Trả lời

7

Bạn có thể vẽ hình ảnh đệm, do đó, hãy tạo một hình trống bufferedImage, tạo ngữ cảnh đồ họa từ đó và vẽ hình ảnh gốc của bạn lên đó.

BufferedImage copyOfImage = 
    new BufferedImage(widthOfImage, heightOfImage, BufferedImage.TYPE_INT_RGB); 
Graphics g = copyOfImage.createGraphics(); 
g.drawImage(originalImage, 0, 0, null); 
+1

Điều đó sẽ mất tính minh bạch. Nếu nghi ngờ, hãy sử dụng 'TYPE_INT_ARGB'. –

+0

Hm ... Điều này có vẻ nhanh hơn cho tôi. – Cenius

+0

Luôn nhớ để 'vứt bỏ()' đối tượng 'Graphics' sau khi sử dụng! – haraldK

0

Có một cách khác:

BufferedImage copyOfImage = image.getSubimage(0, 0, image.getWidth, image.getHeight); 
+2

Không, thao tác này sẽ không hoạt động vì 'copyOfImage' và' image' sẽ chia sẻ bộ đệm sao lưu (nó sẽ là bản sao nông). Các chỉnh sửa được thực hiện cho một, sẽ được phản ánh trong một chỉnh sửa khác. – haraldK

0

Image clone = original.getScaledInstance(original.getWidth(), -1, Image.SCALE_DEFAULT);

này có thể không phải rất đẹp, nhưng getScaledInstance lợi nhuận, như tên cho thấy, một thể hiện của đối tượng gốc Image của bạn. Thông thường chỉ được sử dụng để thay đổi kích thước. -1 cho biết phương pháp giữ tỷ lệ khung hình vì nó là

+1

Bạn có thể vui lòng [sửa] câu trả lời của bạn để giải thích tại sao mã này trả lời câu hỏi? Các câu trả lời chỉ có mã được [nản lòng] (http://meta.stackexchange.com/questions/148272), bởi vì chúng không dạy giải pháp. – DavidPostill

Các vấn đề liên quan