12 contentPane.add(new MyTest());
13 frame.show();
14 }
15
16 private BufferedImage originalImage;
17 private int w;
18 private int h;
19 private WritableRaster raster;
20
21 MyTest() {
22 Image image = null;
23 try {
24 image = ImageIO.read(new File("D:/desktop.png"));
25 } catch (IOException e) {
26 e.printStackTrace();
27 }
28 originalImage = new BufferedImage(image.getWidth(null),image.getHeight(null),
29 BufferedImage.TYPE_INT_RGB);
30 Graphics g = originalImage.getGraphics();
31 g.drawImage(image,0,0,null);
32 raster = originalImage.getRaster();
33 w = originalImage.getWidth();
34 h = originalImage.getHeight();
35 int[] iArray = null;
36 //getPixels返回的数组是BufferedImage内部真实数据的copy
37 int[] array = raster.getPixels(0, 0, w, h, iArray);
38 for (int i = 0; i < array.length; ++i) {
39 array[i] = array[i] - 10;
40 }
41 raster.setPixels(0, 0, w, h, array);
42 }
43
44 public void paintComponent(Graphics g) {
45 super.paintComponent(g);
46 g.drawImage(originalImage, 0, 0, null);
47 }
48 }
11. 图像处理:
如果你有一个图像并且想改变他的外观,该怎么办呢?这是你将需要访问该图像的每一个像素,并用其他的像素来取代这些像素。Java 2D中提供了BufferedImageOp的接口,实现了该接口的类可以对图像进行变换操作。具体使用方式可以参照下面示例代码:
BufferedImageOp op = getBufferedImageOperation();
BufferedImage fileteredImage = new BufferedImage(img.getWidth(),img.getHeight(),img.getType());
op.filter(img,filteredImage);
在Java 2D中为我们提供了5个BufferedImageOp接口的实现类,他们分别是AffineTransformOp、RescaleOp、LookupOp、ColorConvertOp和ConvolveOp。下面的示例代码将给出三种比较常用的图像处理实现类AffineTransformOp、Rescale和ConvolveOp的使用方式。
1 public class MyTest extends JPanel {
2 private BufferedImage image;
3 private static int WINDOW_WIDTH = 600;
4 private static int WINDOW_HEIGHT = 600;
5 static AffineTransform mirrorTransform;
6 static {
7 mirrorTransform = AffineTransform.getTranslateInstance(WINDOW_WIDTH/4,0);
8 // 水平翻转
9 mirrorTransform.scale(-1.0, 1.0);
10 }
11 //初始化所有的BufferedImageOp
12 static BufferedImageOp[] filters = new BufferedImageOp[] {
13 // 1) 显示源图像作为对比
14 null,
15 // 2) 图像的反色显示,这里需要将BufferedImage中每个点的像素都
16 // 乘以-1,在加255。
17 new RescaleOp(-1.0f, 255f, null),
18 // 3) 将亮度提高1.25倍
19 new RescaleOp(1.25f, 0, null),
20 // 4) 模糊该图像,这里的图像过滤主要是和Kernel的数据值相关。
21 new ConvolveOp(new Kernel(3, 3, new float[] { 1/9f, 1/9f, 1/9f, 1/9f, 1/9f, 1/9f,
22 1/9f, 1/9f, 1/9f })),
23 // 5) 锐化该图像。
24 new ConvolveOp(new Kernel(3, 3, new float[] { 0.0f, -0.75f, 0.0f, -0.75f, 4.0f, -0.75f, 0.0f,
25 -0.75f, 0.0f })),
26 // 6) 边缘检测。
27 new ConvolveOp(new Kernel(3, 3, new float[] { 0.0f, -0.75f, 0.0f, -0.75f, 3.0f, -0.75f, 0.0f,
28