Step By Step(Java 2D图形篇<三>) (六)

2014-11-24 03:21:36 · 作者: · 浏览: 4

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