gpt4 book ai didi

java - 类似于 HTML5 的 canvas.putImageData(arrayOfPixels, 0,0) 的 Swing 方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:00:41 26 4
gpt4 key购买 nike

我有一些 Javascript 代码作用于这样定义的像素数组:

screen = {'width':160, 'height':144, 'data':new Array(160*144*4)};
...
canvas.putImageData(GPU._scrn, 0,0);

其中 screen 是宽度 * 高度 * 4 个值的一维数组,代表颜色,详见此处:https://developer.mozilla.org/En/HTML/Canvas/Pixel_manipulation_with_canvas

有没有一种方便的方法可以将这个数组按原样绘制到屏幕上?如果没有,使用 Swing 绘制此数组的最简单方法是什么?

最佳答案

BufferedImage 可能是最灵活的选择。您可以将它用作 Icon 或覆盖 paintComponent() 以获得 Java2D 的全部通用性。

PiRaster

package overflow;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

/** @see http://stackoverflow.com/questions/7298492 */
public class PiRaster extends JPanel {

private static final int W = 30;
private static final int H = 30;
private static List<Integer> pi = new ArrayList<Integer>();
private final List<Integer> clut = new ArrayList<Integer>();
private BufferedImage image;

public PiRaster() {
this.setPreferredSize(new Dimension(W * 16, H * 10));
String s = ""
+ "31415926535897932384626433832795028841971693993751"
+ "05820974944592307816406286208998628034825342117067"
+ "98214808651328230664709384460955058223172535940812"
+ "84811174502841027019385211055596446229489549303819"
+ "64428810975665933446128475648233786783165271201909"
+ "14564856692346034861045432664821339360726024914127";
for (int i = 0; i < s.length(); i++) {
pi.add(s.charAt(i) - '0');
}
for (int i = 0; i < 10; i++) {
clut.add(Color.getHSBColor(0.6f, i / 10f, 1).getRGB());
}
image = new BufferedImage(W, H, BufferedImage.TYPE_INT_ARGB);
int i = 0;
for (int row = 0; row < H; row++) {
for (int col = 0; col < W; col++) {
image.setRGB(col, row, clut.get(pi.get(i)));
if (++i == pi.size()) {
i = 0;
}
}
}
}

private static class ClutPanel extends JPanel {

private int i;

public ClutPanel(List<Integer> rgbList) {
this.setLayout(new GridLayout(1, 0));
for (Integer rgb : rgbList) {
JLabel label = new JLabel(String.valueOf(i++), JLabel.CENTER);
label.setOpaque(true);
label.setBackground(new Color(rgb));
this.add(label);
}
}
}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
PiRaster pr = new PiRaster();
Icon icon = new ImageIcon(pr.image);
frame.add(new JLabel(icon), BorderLayout.WEST);
frame.add(pr, BorderLayout.CENTER);
frame.add(new ClutPanel(pr.clut), BorderLayout.SOUTH);
frame.pack();
frame.setVisible(true);
}
});
}
}

关于java - 类似于 HTML5 的 canvas.putImageData(arrayOfPixels, 0,0) 的 Swing 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7297950/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com