Java数字图像处理基础 - 必读
写了很多篇关于图像处理的文章,没有一篇介绍Java 2D的图像处理API,文章讨论和提及的
API都是基于JDK6的,首先来看Java中如何组织一个图像对象BufferedImage的,如图:

一个BufferedImage的像素数据储存在Raster中,ColorModel里面储存颜色空间,类型等
信息,当前Java只支持一下三种图像格式- JPG,PNG,GIF,如何向让Java支持其它格式,首
先要 完成Java中的图像读写接口,然后打成jar,加上启动参数- Xbootclasspath/p
newimageformatIO.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); //初始化对象 http://www.cnblogs.com/roucheng/
tracker.addImage(image_01, 1); // 加入要跟踪的BufferedImage对象image_001
tracker.waitForID(1, 10000) // 等待10秒,让iamge_01图像加载
从一个32位int型数据cARGB中读取图像RGB颜色值的代码如下:
int alpha = (cARGB >> 24)& 0xff; //透明度通道 http://www.cnblogs.com/roucheng/
int red = (cARGB >> 16) &0xff;
int green = (cARGB >> 8) &0xff;
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()); // Display the window. http://www.cnblogs.com/roucheng/
frame.getContentPane().add(new PlasmaDemo(), BorderLayout.CENTER);
frame.setPreferredSize(new Dimension(400 + 25,450));
frame.pack();
frame.setVisible(true);
}
}
Java数字图像处理基础 - 必读的更多相关文章
- java数字游戏基础篇
题目: 1.100以内,程序先产生一个随机数,然后用户从控制台输入数字,猜是大了还是小了,第7次时 输出 “您太笨了,答案是”+x 思路:1.随机数,所以用到random 2.用户从键盘输入 ,则用到 ...
- MATLAB数字图像处理基础
图像的输入.输出和显示 1.图像的输入 imread('filename'), 实际中写的是 >> f = imread('sky.jpg'); 2.图像的显示 imshow ...
- Java ——数字图像处理(Java Graphics及其API简介)
1.创建一个Graphics对象BufferedImage bi = new BufferedImage(120,120, BufferedImage.TYPE_INT_ARGB);Graphics2 ...
- MATLAB数字图像处理(一)基础操作和傅立叶变换
数字图像处理是一门集计算机科学.光学.数学.物理学等多学科的综合科学.随着计算机科学的发展,数字图像处理技术取得了巨大的进展,呈现出强大的生命力,已经在多种领域取得了大量的应用,推动了社会的发展.其中 ...
- matlab数字图像处理 入门基础
本代码基于张铮主编的<数字图像处理与机器视觉>一书. 源图片:lena A = imread ('lena.jpg'); %读入图像lena.jpg,赋给变量A %imwrite(A,'l ...
- 数字图像处理学习笔记之一 DIP绪论与MATLAB基础
写在前面的话 数字图像处理系列的学习笔记是作者结合上海大学计算机学院<数字图像处理>课程的学习所做的笔记,使用参考书籍为<冈萨雷斯数字图像处理(第二版)(MATLAB版)>,同 ...
- 数字图像处理笔记与体会(一)——matlab编程基础
最近开始学习数字图像处理,使用matlab实现,下面我就来记录笔记和体会,一方面是给大家提供参考,另一方面是防止我忘记了. 复习一下: 1.数字图像是用一个数字矩阵来表示的,数字阵列中的每个数字,表示 ...
- Matlab绘图基础——colormap在数字图像处理及三维图形展示上的应用(分层设色)
色图(color map)是MATLAB系统引入的概念.在MATLAB中,每个图形窗口只能有一个色图. 色图是m×3 的数值矩阵,它的每一行是RGB三元组.色图矩阵可以人为地生成 ...
- 数字图像处理作业使用OpenCV - 使用笔记
数字图像处理作业的输入图像全部都是灰度图像,所以汇总一下自己遇到的问题答案. OCV的图像容器是Mat<typename>,可以用imread(filename)读取图像,filename ...
随机推荐
- Strategy策略设计模式
1.策略模式和状态模式的区别和联系(本部分转载自:http://letscoding.cn/java%E4%B8%AD%EF%BC%8C%E7%8A%B6%E6%80%81%E6%A8%A1%E5%B ...
- Linux和UNIX监控
Linux和UNIX上的数据库监控工具包括监控CPU.内存.磁盘.网络.安全性和用户的监控工具.下面罗列了我们找到的有用工具及其简单描述. ps 显示系统上运行的进程列表 top ...
- VS2005 / windows sdk7.1配置
VS2005工程需要调用一些后期VS带的库 1. VS2005 安装顺序 1.vs20052.msdn(optional)3.VS80sp1-KB926601-X86-ENU_SP1.exe4.VS8 ...
- AppScan学习笔记
AppScan学习笔记 http://www.docin.com/p-777386896.html
- ubuntu系统从中文环境改成英文环境
我们在 安装ubuntu server版的时候,有人可能选择了中文环境安装,因为那样好设置时区等参数,可是安装好了后,运行某些命令的时候会有中文乱码提示,看起很是头蛋疼, 我们就需要将其改成英文环 ...
- Xamarin.Forms中的ListView的ItemTrapped事件与ItemSelected事件的区别
今天对Xamarin.Forms中的ListView的两个事件(ItemTrapped和ItemSelected)做了小小的研究,发现有以下几点区别: 1.ItemTrapped事件会优先被触发. 2 ...
- Android开发中内存和UI优化
1.内存||效率 GC这东西对于开发人员用起来比较爽,但对于技术总监或产品总监来说,他们并不在乎,在乎的是用户运行App的流畅度,待你开发完了,笑眯眯的走过来,让你测试N个适配器,烦都烦死你. 说到这 ...
- Python Django 开发 3 数据库CURD
上一篇表建好后开始对数据进行CURD操作 dos输入: >>>python manage.py shell 以下的命令都是在shell中测试 (C)增: >>>im ...
- 解决方法:64位系统-未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序
win7或win8 64位下调试程序,出现这样的错误提示:未在本地计算机上注册 Microsoft.Jet.OLEDB.4.0 提供程序 解决方法如下: 方法一:“设置应用程序池默认属性”/“常规”/ ...
- NopCommerce 开源商城下载配置安装
NopCommerce 是一款开源商城系统,提供了完整的解决方案.应该来说是目前最完善,功能最强劲的商城系统.基于ASP.NET MVC 框架,EF框架,数据库MSSQL. 系统版本涵盖了从MVC3. ...