cuốn sách gpt4 ai đã làm

Vẽ BufferedImage sang BufferedImage khác đang thay đổi giá trị RGBA

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-02 19:10:24 26 4
mua khóa gpt4 Nike

Tôi đang cố gắng sao chép Hình ảnh đệm Đã xảy ra sự cố với đối tượng.

tôi đang sử dụng drawImage (Hình ảnh BufferedImage, int x, int y, người quan sát ImageObserver) phương pháp vẽ hình ảnh gốc lên hình ảnh mới, tôi đang cài đặt BufferedImage.TYPE_INT_ARGB Tuy nhiên, với mỗi ảnh, khi mình in giá trị màu ảnh mới thì giá trị RGBA hơi khác nhau một chút.

Tôi cần tạo một bản sao của hình ảnh gốc vì tôi có một JPanel Chứa hình ảnh được vẽ làm nền. Trong các phần khác của ứng dụng, tôi phải lấy hình ảnh từ bảng điều khiển, nhưng tôi muốn trả lại một bản sao để tránh sửa đổi hình ảnh từ nơi khác.

Làm thế nào tôi có thể giải quyết vấn đề này?

Mã số:

nhập java.awt.Color;
nhập java.awt.Graphics2D;
nhập java.awt.image.BufferedImage;
lớp công khai BufferedImageColorBug
{
public static void main (Chuỗi [] a) {
Màu [] màu = {
Màu mới (202.230.186.14),
Màu mới (254,65,188,214),
Màu mới (247.104.197.198),
Màu mới (158,93,79,239),
Màu mới (235,45,57,194),
Màu mới (155,77,126,150),
Màu mới (164.237.20.172),
Màu mới (184,106,97,191),
Màu mới (187,249,135,85),
Màu mới (236,112,98,24)
};
Hình ảnh BufferedImage = BufferedImage mới (colors.length, 1, BufferedImage.TYPE_INT_ARGB);
for (int x = 0; x < color.length; x ++) image.setRGB (x, 0, màu [x].getRGB ());
Bản sao BufferedImage = BufferedImage mới (image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = copy.createGraphics ();
g2d.drawImage (hình ảnh, 0, 0, null);
g2d.dispose();
for (int x = 0; x < color.length; x ++) {
Màu màu = Màu mới (copy.getRGB (x, 0), true);
System.out.println (color.getRed () + "," + color.getGreen () + "," + color.getBlue () + "," + color.getAlpha ());
}
}
}

Đây là đầu ra tôi nhận được:

200,237,182,14
254,66,188,214
247.104.197.198
158,93,79,239
235,45,57,194
155,76,126,150
165,237,19,172
184,105,97,191
186,249,135,85
234,117,96,24

biên tập

Tôi đã nói về việc nhân bản hình ảnh vì đó là mục tiêu của tôi, nhưng với câu hỏi này tôi muốn hiểuTại saogiá trị rgba khác nhau giữa các hình ảnh.

Tôi đã thử sử dụng BufferedImage.TYPE_INT_ARGB_PRE, nhưng vô ích.

câu trả lời hay nhất

Để tạo một bản sao chính xác của hình ảnh (giả sử tất cả chúng đều cùng loại), bạn có thể thay đổi mã của mình một chút:

Bản sao BufferedImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);
copy.setData(image.getRaster()); // getRaster() nhanh hơn getData(), vì không có bản sao nào được tạo

for (int x = 0; x < color.length; x++) {
Màu màu = Màu mới(copy.getRGB(x, 0), true);
System.out.println(color.getRed() + "," + color.getGreen() + "," + color.getBlue() + "," + color.getAlpha());
}

Điều này sẽ in giống như bản gốc màu sắc Màu sắc giống nhau trong mảng.


Tái bút: Ban đầu tôi nghĩ đây là một lỗi, nhưng bây giờ tôi nhận ra có lẽ không phải vậy.

Sau một số thử nghiệm, tôi nhận thấy có một chút khác biệt giữa mã của bạn và mã tôi thường sử dụng để sao chép hình ảnh. Nếu bạn thay đổi quy tắc tổng hợp alpha thành Src(nghĩa là chỉ có nguồn đóng góp và thay thế hoàn toàn các pixel ở đích), bạn cũng nhận được kết quả như mong đợi:

Bản sao BufferedImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);

Graphics2D g2d = copy.createGraphics();
g2d.setComposite(AlphaComposite.Src); // Thay thế hoàn toàn, mặc định là SrcOver
g2d.drawImage(hình ảnh, 0, 0, null);
g2d.dispose();

for (int x = 0; x < color.length; x++) {
Màu màu = Màu mới(copy.getRGB(x, 0), true);
System.out.println(color.getRed() + "," + color.getGreen() + "," + color.getBlue() + "," + color.getAlpha());
}

Lý do là khi ghép các pixel bán trong suốt thành các pixel hoàn toàn trong suốt, các pixel trong suốt ban đầu ở đích sẽ ảnh hưởng đến kết quả cuối cùng, làm thay đổi giá trị RGBA.

Về java - Vẽ BufferedImage sang BufferedImage khác đang thay đổi giá trị RGBA, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/46363815/

26 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress