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

一个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); 
   } 
}

(0)

相关推荐

  • Java实现的图像查看器完整实例

    本文实例讲述了Java实现的图像查看器.分享给大家供大家参考.具体如下: 1. MyCanvas.java: package PictureViewer; import java.awt.*; import java.awt.event.*; import java.awt.image.*; public class MyCanvas extends Canvas implements ComponentListener{ private BufferedImage bi; private Im

  • Java图像处理教程之正片叠底效果的实现

    前言 本文主要给大家介绍了关于利用Java如何实现正片叠底效果的方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 正片叠底,在Photoshop中是一种混合模式,简单的说就是可以让2个图层的内容融合起来. PS中最佳展示用例 融合的计算公式其实非常简单,就是 A*B/255.(A.B是指的图层A和图层B) 再解释一下就是: A图层中的红色通道和B图层中的红色通道所对应的每一个像素的灰阶值相乘,再被255除.得到一个新的红色通道. 蓝色与绿色通道的操作也是一样的. 实现方法

  • 详解Java如何实现图像灰度化

    24位彩色图与8位灰度图 首先要先介绍一下24位彩色图像,在一个24位彩色图像中,每个像素由三个字节表示,通常表示为RGB.通常,许多24位彩色图像存储为32位图像,每个像素多余的字节存储为一个alpha值,表现有特殊影响的信息[1]. 在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值.亮度值),灰度范围为0-255[2].这样就得到一幅图片的灰度图. 几种灰度化的方法 1.分量法:使用RGB三个分量中

  • 使用Java进行图像处理的一些基础操作

    图像是由一组像素构成,用二进制形式保存的图片.java语言支持GIF.JPEG和BMP这3种主要图像文件格式.java语言的图像处理功能被封装在Image类中. 图像载入和输出 在java程序中,图像也是对象,所以载入图像时,先要声明Image对象,然后,利用getImage()方法把Image对象与图像文件联系起来.载入图像文件的方法有两个: Image getImage(URL url),url指明图像所在位置和文件名. Image getImage(URL url,String name)

  • Java图像之自定义角度旋转(实例)

    图像的旋转需要调用 Graphics2D 类的rotate()方法,该方法将根据指定的弧度旋转图像. 语法如下: rotate(double theta) 其中, theta 是指旋转的弧度. 说明:该方法只接受旋转的弧度作为参数,可以使用 Math 类的 toRadians()方法将角度转换为弧度. toRadians()方法接受角度值作为参数,返回值是转换完毕的弧度值. 实例代码: /** *//** * 旋转图片为指定角度 * * @param bufferedimage * 目标图像 *

  • 举例解析Java的图像缓冲技术的使用

    当图像信息量较大,采用以上直接显示的方法,可能前面一部分显示后,显示后面一部分时,由于后面一部分还未从文件读出,使显示呈斑驳现象.为了提高显示效果,许多应用程序都采用图像缓冲技术,即先把图像完整装入内存,在缓冲区中绘制图像或图形,然后将缓冲区中绘制好的图像或图形一次性输出在屏幕上.缓冲技术不仅可以解决闪烁问题,并且由于在计算机内存中创建图像,程序可以对图像进行像素级处理,完成复杂的图像变换后再显示. [例]小应用程序程序演示图像缓冲显示技术.程序运行时,当鼠标在图像区域内按下时,图像会出现边框,

  • 简述Java图像倾斜方法及实例 原创

    可以使用 graphics2D 类提供的 shear() 方法设置绘图的倾斜方向,从而使图像实现倾斜的效果.下面,我们一起来看一下它的使用方法和实例. 语法如下: shear(double shx,double shy) shx:水平方向的倾斜量: shy:垂直方向的倾斜量.    实例:在窗体上绘制图像,使图像在水平方向实现倾斜效果.下面是具体代码: public class TiltImage extends JFrame{ private Image img; private MyCanv

  • Java图像处理工具类

    本工具类的功能:缩放图像.切割图像.图像类型转换.彩色转黑白.文字水印.图片水印等 复制代码 代码如下: package net.kitbox.util; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Re

  • Java应用程序中创建图像

    合成图像 您不必从文件中读取所有的图像 - 您可以创建自己的图像.要创建自己的图像,最灵活的方法是用一个 BufferedImage 对象,它是 Image 类的一个子类,它把图像数据存储在一个可以被访问的缓冲区中.它还支持各种存储像素数据的方法:使用或不使用 alpha 通道.不同种类的颜色模型以及颜色组件的各种精确度.ColorModel 类提供一种灵活的方法定义各种颜色模型,以和 BufferedImage 对象一起使用.为了理解颜色模型工作的基本知识,我们将只使用一个缺省的颜色模型,其颜

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

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

  • Java数字图像处理之图像灰度处理

    本文实例为大家分享了Java数字图像处理基础之图像灰度处理,供大家参考,具体内容如下 一.简介 图像灰度化处理可以作为图像处理的预处理步骤,在图像处理中是十分重要的一件事.灰度图像上每个像素的颜色值又称为灰度,指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0. 灰度转换公式: int gray = (int)(color.getRed() * 0.299 + color.getGreen() * 0.587 + color.getBlue() *0.114); 我们只是需要

  • Python数字图像处理基础直方图详解

    目录 直方图的定义 直方图的性质 直方图的应用 图像增强 图像分割 图像识别 Python直方图的计算 直方图的定义 直方图的性质 只统计某个灰度级出现的次数,图像的大小不一样的话, 某灰度值的像素出现的次数是不一样的. 那如果我们在这基础上除以像素总个数的话,那就是某一灰度级出现的概率,那么这样的话不同大小的同一内容图像其灰度直方图是一样的. 直方图的应用 图像增强 图像分割 图像识别 Python直方图的计算 import cv2 import numpy as np import matp

  • python数字图像处理环境安装与配置过程示例

    目录 引言 一.需要的安装包 二.下载并安装 anaconda 三.简单测试 四.skimage包的子模块 引言 一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因此,我们这里使用python这个脚本语言来进行数字图像处理. 要使用python,必须先安装python,一般是2.7版本以上,不管是在windows系统,还是linux系统,安装都是非

  • python数字图像处理像素的访问与裁剪示例

    目录 引言 引言 图片读入程序中后,是以numpy数组存在的.因此对numpy数组的一切功能,对图片也适用.对数组元素的访问,实际上就是对图片像素点的访问. 彩色图片访问方式为: img[i,j,c] i表示图片的行数,j表示图片的列数,c表示图片的通道数(RGB三通道分别对应0,1,2).坐标是从左上角开始. 灰度图片访问方式为: gray[i,j] 例1:输出小猫图片的G通道中的第20行30列的像素值 from skimage import io,data img=data.chelsea(

  • python数字图像处理之图像自动阈值分割示例

    目录 引言 1.threshold_otsu 2.threshold_yen 3.threshold_li 4.threshold_isodata 5.threshold_adaptive 引言 图像阈值分割是一种广泛应用的分割技术,利用图像中要提取的目标区域与其背景在灰度特性上的差异,把图像看作具有不同灰度级的两类区域(目标区域和背景区域)的组合,选取一个比较合理的阈值,以确定图像中每个像素点应该属于目标区域还是背景区域,从而产生相应的二值图像. 在skimage库中,阈值分割的功能是放在fi

  • Java实现BP神经网络MNIST手写数字识别的示例详解

    目录 一.神经网络的构建 二.系统架构 服务器 客户端 采用MVC架构 一.神经网络的构建 (1):构建神经网络层次结构 由训练集数据可知,手写输入的数据维数为784维,而对应的输出结果为分别为0-9的10个数字,所以根据训练集的数据可知,在构建的神经网络的输入层的神经元的节点个数为784个,而对应的输出层的神经元个数为10个.隐层可选择单层或多层. (2):确定隐层中的神经元的个数 因为对于隐层的神经元个数的确定目前还没有什么比较完美的解决方案,所以对此经过自己查阅书籍和上网查阅资料,有以下的

  • Java swing 图像处理多种效果实现教程

    项目记录: 1.图像原理 通常图像都是2D,对一副图像,可以看做其宽w*高h的一个二维数组, 即 图像=int[w][h],在w和h位置的每一个 int 值,就是这个点的像素值. 图像处理的本质是:对代表图像二维数组中的值进行重新计算. 2.思路: 将一张图片转化成一个int型癿二维数组 对于每一个像素点大小和颜色进行计算达到图像处理的效果. 在画笔中设置好颜色,填充形状然后将新的图片画出. 3.实现效果 获取像素点方法,首先利用文件imageIO读取图片,然后根据图片长宽进行遍历得到每个像素点

  • java编程进阶小白也能手写HashMap代码

    目录 什么是HashMap HashCode和数组 Hash碰撞 toString方法 百万级数据压测 步骤 1 来100w条数据,看看要花多久? 步骤 2 设计思路 步骤 3 添加一个size 步骤 4 先设计,后实现 步骤 5 扩容方法 步骤 6 reHash方法 步骤 7 新的问题出现 步骤 8 indexForTable方法 步骤 9 重新转测 步骤 10 再次测试100w数据 步骤 11 PK 原生JDK8的HashMap 补丁 步骤 1 put元素的bug 步骤 2 HashMap为

  • 讲解Java中的基础类库和语言包的使用

    Java基础类库 Java 的类库是 Java 语言提供的已经实现的标准类的集合,是 Java 编程的 API(Application Program Interface),它可以帮助开发者方便.快捷地开发 Java 程序.这些类根据实现的功能不同,可以划分为不同的集合,每个集合组成一个包,称为类库.Java 类库中大部分都是由Sun 公司提供的,这些类库称为基础类库. Java 语言中提供了大量的类库共程序开发者来使用,了解类库的结构可以帮助开发者节省大量的编程时间,而且能够使编写的程序更简单

随机推荐