-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathImagePanel.java
More file actions
85 lines (73 loc) · 2.5 KB
/
ImagePanel.java
File metadata and controls
85 lines (73 loc) · 2.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import javax.swing.JPanel;
import java.awt.image.*;
import java.util.ArrayList;
import java.awt.event.*;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import java.awt.Graphics;
public class ImagePanel extends JPanel implements ComponentListener {
private static final int DEFAULT_WIDTH = 640;
private static final int DEFAULT_HEIGHT = 480;
private static final int WHITE = 0xFFFFFFFF;
BufferedImage image;
ArrayList<Integer> fullData;
public ImagePanel() {
super();
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
addComponentListener(this);
}
public void setPixelData (ArrayList<Integer> pixelArray) {
fullData = pixelArray;
updateImage();
}
public BufferedImage getImage() {
return image;
}
private void updateImage () {
int[] pixelArray = convertToPrimitiveArray(fullData);
translateDataToImage(pixelArray);
JLabel picture = new JLabel(new ImageIcon(image));
removeAll();
add(picture);
repaint();
}
private void translateDataToImage (int[] pixelData) {
Dimension panelSize = this.getSize();
image = new BufferedImage(panelSize.width, panelSize.height, BufferedImage.TYPE_INT_RGB);
int[] visiblePixels = subsetPixels(pixelData);
WritableRaster pixelGrid = image.getRaster();
pixelGrid.setDataElements(pixelGrid.getMinX(), pixelGrid.getMinY(), panelSize.width, panelSize.height, visiblePixels);
}
private int[] convertToPrimitiveArray (ArrayList<Integer> integers) {
int[] primitiveArray = new int[integers.size()];
for (int i = 0; i < integers.size(); i++)
primitiveArray[i] = integers.get(i);
return primitiveArray;
}
private int[] subsetPixels (int[] fullData) {
Dimension panelSize = this.getSize();
int numPixels = panelSize.width * panelSize.height;
int[] resultArray = new int[numPixels];
if (numPixels < fullData.length) {
for (int i = 0; i < numPixels; i++)
resultArray[i] = fullData[i];
} else {
for (int i = 0; i < fullData.length; i++)
resultArray[i] = fullData[i];
for (int i = fullData.length; i < numPixels; i++)
resultArray[i] = WHITE;
}
return resultArray;
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, Color.white, null);
}
/* Implementation of the ComponentListener interface */
public void componentHidden(ComponentEvent e) { }
public void componentMoved(ComponentEvent e) { }
public void componentResized(ComponentEvent e) { updateImage(); }
public void componentShown(ComponentEvent e) { }
}