java数字图像处理基础使用imageio写图像文件示例_java

一个BufferedImage的像素数据储存在Raster中,ColorModel里面储存颜色空间,类型等信息,当前Java只支持一下三种图像格式- JPG,PNG,GIF,如何向让Java支持其它格式,首先要 完成Java中的图像读写接口,然后打成jar,加上启动参数- Xbootclasspath/pnewimageformatIO.jar即可。

Java中如何读写一个图像文件,使用ImageIO对象即可。读图像文件的代码如下:

 

复制代码 代码如下:

File file = new File("D:\\test\\blue_flower.jpg");
BufferedImage image = ImageIO.read(file);

写图像文件的代码如下:

复制代码 代码如下:

File outputfile = new File("saved.png");
ImageIO.write(bufferedImage, "png",outputfile);

从BufferedImage对象中读取像素数据的代码如下:

复制代码 代码如下:

int type= image.getType();
if ( type ==BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )
return (int [])image.getRaster().getDataElements(x, y, width, height, pixels );
else
return image.getRGB( x, y, width, height, pixels, 0, width );

首先获取图像类型,如果不是32位的INT型数据,直接读写RGB值即可,否则需要从Raster
对象中读取。

往BufferedImage对象中写入像素数据同样遵守上面的规则。代码如下:

复制代码 代码如下:

int type= image.getType();
if ( type ==BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )
image.getRaster().setDataElements(x, y, width, height, pixels );
else
image.setRGB(x, y, width, height, pixels, 0, width );

读取图像可能因为图像文件比较大,需要一定时间的等待才可以,Java Advance Image
Processor API提供了MediaTracker对象来跟踪图像的加载,同步其它操作,使用方法如下:
MediaTracker tracker = new MediaTracker(this); //初始化对象
tracker.addImage(image_01, 1); // 加入要跟踪的BufferedImage对象image_001
tracker.waitForID(1, 10000) // 等待10秒,让iamge_01图像加载
从一个32位int型数据cARGB中读取图像RGB颜色值的代码如下:
1 int alpha = (cARGB >> 24)& 0xff; //透明度通道
2 int red = (cARGB >> 16) &0xff;
3 int green = (cARGB >> 8) &0xff;
4 int blue = cARGB & 0xff;
将RGB颜色值写入成一个INT型数据cRGB的代码如下:
cRGB = (alpha << 24) | (red<< 16) | (green << 8) | blue;
创建一个BufferedImage对象的代码如下:
BufferedImage image = newBufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB);
一个完整的源代码Demo如下:

复制代码 代码如下:

 package com.gloomyfish.swing;

 import java.awt.BorderLayout;
 import java.awt.Dimension;
 import java.awt.Graphics;
 import java.awt.Graphics2D;
 import java.awt.RenderingHints;
 import java.awt.image.BufferedImage;
 import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class PlasmaDemo extends JComponent { 

    /**
     * 
     */ 
    private static final long serialVersionUID = -2236160343614397287L; 
    private BufferedImage image = null; 
    private int size = 256;

    public PlasmaDemo() { 
        super(); 
        this.setOpaque(false); 
    } 

    protected void paintComponent(Graphics g) { 
        Graphics2D g2 = (Graphics2D)g; 
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
        g2.drawImage(getImage(), 5, 5, image.getWidth(), image.getHeight(), null); 
    } 

    private BufferedImage getImage() { 
        if(image == null) { 
            image = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB); 
            int[] rgbData = new int[size*size]; 
            generateNoiseImage(rgbData); 
            setRGB(image, 0, 0, size, size, rgbData);
            File outFile = new File("plasma.jpg");
            try {
                ImageIO.write(image, "jpg", outFile);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } 
        return image; 
    } 

    public void generateNoiseImage(int[] rgbData) { 
        int index = 0; 
        int a = 255; 
        int r = 0; 
        int g = 0; 
        int b = 0; 

        for(int row=0; row<size; row++) { 
            for(int col=0; col<size; col++) { 
                // set random color value for each pixel 
                r = (int)(128.0 + (128.0 * Math.sin((row + col) / 8.0))); 
                g = (int)(128.0 + (128.0 * Math.sin((row + col) / 8.0))); 
                b = (int)(128.0 + (128.0 * Math.sin((row + col) / 8.0))); 

                rgbData[index] = ((clamp(a) & 0xff) << 24) | 
                                ((clamp(r) & 0xff) << 16)  | 
                                ((clamp(g) & 0xff) << 8)   | 
                                ((clamp(b) & 0xff)); 
                index++; 
            } 
        } 

    } 

    private int clamp(int rgb) { 
        if(rgb > 255) 
            return 255; 
        if(rgb < 0) 
            return 0; 
        return rgb; 
    }   

    public void setRGB( BufferedImage image, int x, int y, int width, int height, int[] pixels ) { 
        int type = image.getType(); 
        if ( type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB ) 
            image.getRaster().setDataElements( x, y, width, height, pixels ); 
        else 
            image.setRGB( x, y, width, height, pixels, 0, width ); 
    } 

    public static void main(String[] args) { 
        JFrame frame = new JFrame("Noise Art Panel"); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.getContentPane().setLayout(new BorderLayout()); 

        frame.getContentPane().add(new PlasmaDemo(), BorderLayout.CENTER); 
        frame.setPreferredSize(new Dimension(400 + 25,450)); 
       frame.pack(); 
       frame.setVisible(true); 
   } 

时间: 2024-10-07 20:26:27

java数字图像处理基础使用imageio写图像文件示例_java的相关文章

《Visual C++数字图像模式识别技术详解(第2版)》一第2章 Visual C++数字图像处理基础

第2章 Visual C++数字图像处理基础 作为微软公司推出的一款功能强大而复杂的编译器,Visual C++提供了完善的Windows应用程序编程框架.它可用于开发各种类型.不同规模和复杂程度的应用程序,开发效率高,生成的应用软件代码性能优良. 利用Visual C++编程语言进行数字图像处理,可以充分发挥Visual C++编程灵活.功能强大.代码效率高等特点,在快速进行各种数字图像处理基础上,有效实现基于数字图像的各种模式识别应用. [本章导读] 2.1 Visual C++编程方法 系

《Java数字图像处理:编程技巧与应用实践》——导读

前 言 为什么要写这本书 我对图像处理的认识最初来自于读软件工程专业时做毕业设计论文的需要,毕业论文做完以后,我便把所有关于图像处理的知识扔到了一边.2011年的一天有位朋友问了我几个简单的图像处理方面的问题,在解答问题的过程中我发现自己对图像处理的热情一直都在燃烧,从那一刻起我决定重新学习图像处理.这之后,我把以前买的几本图像处理的书都读了一遍,同时还坚持通过写博客来督促自己加深理解,随着学习的不断深入,对图像处理的认知也在不断加深,我越来越渴望自己能实现那些书中提到的图像处理手段与方法,于是

《Java数字图像处理:编程技巧与应用实践》——3.5 一个完整的Swing UI Demo

3.5 一个完整的Swing UI Demo 本节将根据前面前四节所讲的Swing UI组件应用知识,实现一个真正的Swing UI演示,以更加贴近实际编程的方式来说明Swing中组件的应用知识.首先来介绍一下要实现的功能: 通过文件对话框选择图像文件,刷新JFrame中的内容面板实现图像显示. 通过单击[处理]按钮实现对图像的必要处理,然后刷新显示图像. 大致的UI组件布局如图3-1所示. 其中支持BufferedImage对象显示的自定义JPanel类的实现如下: package com.b

《Java数字图像处理:编程技巧与应用实践》——2.3 基于BufferedImageOp的图像滤镜演示

2.3 基于BufferedImageOp的图像滤镜演示 通过前面两节的学习,我们已经大致了解BufferedImageOp接口及其实现类的功能.实践出真知,本节将演示BufferedImageOp接口中每个实现类的实际使用场景,达到知行合一.学以致用的目的,帮助大家解决项目中遇到的实际问题.为了让大家对应用效果有更加深刻的印象,下面会使用BufferedImageOp的实现类来实现如下几个滤镜特效功能. 黑白滤镜:将彩色图像自动转换为黑白两色图像. 灰度滤镜:将彩色图像自动转换为灰度图像. 模

《Java数字图像处理:编程技巧与应用实践》——3.6 小结

3.6 小结 本章一步一步地剖析如何了构建一个Swing UI程序,介绍了JPanel.JButton.JFile-Chooser等组件的用法,最后通过JFrame组件组合成为用户交互界面,实现了对图像文件的显示与操作,以及UI响应用户的操作与刷新.这也是本书后面多数章节中要用到的测试UI,所以学习与掌握本章知识,将为后面图像处理的代码提供一个UI现实与效果演示界面,帮助读者加深对知识的理解.前面三章已经介绍了Java图像处理API基础知识与Swing的基础知识,这为后面学习图像处理做了很好的铺

《Java数字图像处理:编程技巧与应用实践》——第2章 Java BufferedImage对象及其支持的API操作 2.1 BufferedImage对象的构成

第2章 Java BufferedImage对象及其支持的API操作 第1章我们一起学习了Java中的Graphics图形包基本概念与知识,本章将介绍Java中关于图像文件操作的基本知识.首先是Java 2D图像对象BufferedImage的组件构成.与图像文件之间的关系.格式支持,以及如何利用BufferedImage对象在Java语言中实现像素读写操作.然后通过BufferedImageOp接口介绍Java中几种非常有用的对像素操作的Buffered-ImageOp的实现类.最后将集合上述

《Java数字图像处理:编程技巧与应用实践》——2.2 Java BufferedImageOp API

2.2 Java BufferedImageOp API 本节将介绍Java中最常用的操作图像像素的API接口BufferedImageOp,通过它,可以实现图像像素的调整,呈现出不同的图像显示效果,并且可编辑图像内容等. 2.2.1 Java BufferedImageOp 接口介绍 当前BufferedImageOp接口中最重要的方法是filter()方法,这是所有实现类必须完成的.目前BufferedImageOp有下面五个实现类. AffineTransformOp :主要操作是提供各种

《Java数字图像处理:编程技巧与应用实践》——第1章 Java Graphics及其API简介 1.1 什么是Java图形设备Graphics

第1章 Java Graphics及其API简介 在开始本书内容之前,笔者假设你已经有了面向对象语言编程的基本概念,了解Java语言的基本语法与特征,原因在于本书的所有源代码都是基于Java语言实现的,而且是基于Java开发环境运行与演示所有图像处理算法的.本书第1章到第3章是为了帮助读者了解与掌握Java 图形与GUI编程的基本知识与概念而写的.本章主要介绍Java GUI编程中基本的图形知识,针对GUI编程,Java语言提供了两套几乎并行的API,分别是Swing与AWT.早期的Java G

《Java数字图像处理:编程技巧与应用实践》——2.4 小结

2.4 小结 本章重点介绍了Java 2D中关于图像方面的操作接口类BufferedImageOp,通过其实现类可以很方便地实现图像的色彩空间转换,自定义颜色查找表,卷积功能(包括边缘提取.线性模糊.高斯模糊),图像的放大与缩小.错切变化.平移变换.旋转变换等.最后本章通过编码实现了几种简单而且常见的图像处理功能,帮助读者加深对BufferedImageOp接口的认识.如果你还想更加深入地了解BufferedImageOp接口实现类的使用,请参照JDK官方文档说明,同时建议你多多编程实践,只有加