下面代码中用到的sourceImage是一个已经存在的Image对象
图像剪切
对于一个已经存在的Image对象,要得到它的一个局部图像,可以使用下面的步骤:
//import Java.awt.*;
//import java.awt.image.*;
Image croppedImage;
ImageFilter cropFilter;
CropFilter =new CropImageFilter(25,30,75,75); //四个参数分别为图像起点坐标和宽高,即CropImageFilter(int x,int y,int width,int height),详细情况请参考API
CroppedImage= Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(sourceImage.getSource(),cropFilter));
如果是在Component的子类中使用,可以将上面的Toolkit.getDefaultToolkit().去掉。FilteredImageSource是一个ImageProdUCer对象。
图像缩放
对于一个已经存在的Image对象,得到它的一个缩放的Image对象可以使用Image的getScaledInstance方法:
Image scaledImage=sourceImage. getScaledInstance(100,100, Image.SCALE_DEFAULT); //得到一个100X100的图像
Image doubledImage=sourceImage. getScaledInstance(sourceImage.getWidth(this)*2,sourceImage.getHeight(this)*2, Image.SCALE_DEFAULT); //得到一个放大两倍的图像,这个程序一般在一个swing的组件中使用,而类Jcomponent实现了图像观察者接口ImageObserver,所有可以使用this。
//其它情况请参考API
灰度变换
下面的程序使用三种方法对一个彩色图像进行灰度变换,变换的效果都不一样。一般而言,灰度变换的算法是将象素的三个颜色分量使用R*0.3+G*0.59+B*0.11得到灰度值,然后将之赋值给红绿蓝,这样颜色取得的效果就是灰度的。另一种就是取红绿蓝三色中的最大值作为灰度值。java核心包也有一种算法,但是没有看源代码,不知道具体算法是什么样的,效果和上述不同。
/* GrayFilter.java*/
/*@author:cherami */
/*email:cherami@163.net*/
import java.awt.image.*; public class GrayFilter extends RGBImageFilter {
int modelStyle;
public GrayFilter() {
modelStyle=GrayModel.CS_MAX;
canFilterIndexColorModel=true;
}
public GrayFilter(int style) {
modelStyle=style;
canFilterIndexColorModel=true;
}
public void setColorModel(ColorModel cm) {
if (modelStyle==GrayModel
else if (modelStyle==GrayModel
}
public int filterRGB(int x,int y,int pixel) {
return pixel;
}
}
/* GrayModel.java*/
/*@author:cherami */
/*email:cherami@163.net*/
import java.awt.image.*;
public class GrayModel extends ColorModel {
public static final int CS_MAX=0;
public static final int CS_FLOAT=1;
ColorModel sourceModel;
int modelStyle;
public GrayModel(ColorModel sourceModel) {
super(sourceModel.getPixelSize());
this.sourceModel=sourceModel;
modelStyle=0;
}
<!---->
<!---->
public GrayModel(ColorModel sourceModel,int style) {
super(sourceModel.getPixelSize());
this.sourceModel=sourceModel;
modelStyle=style;
}
public void setGrayStyle(int style) {
modelStyle=style;
}
protected int getGrayLevel(int pixel) {
if (modelStyle==CS_MAX) {
return Math.max(sourceModel.getRed(pixel),Math.max(sourceModel.getGreen(pixel),sourceModel.getBlue(pixel)));
}
else if (modelStyle==CS_FLOAT){
return (int)(sourceModel.getRed(pixel)*0.3+sourceModel.getGreen(pixel)*0.59+sourceModel.getBlue(pixel)*0.11);
}
else {
return 0;
}
}
public int getAlpha(int pixel) {
return sourceModel.getAlpha(pixel);
}
public int getRed(int pixel) {
return getGrayLevel(pixel);
}
public int getGreen(int pixel) {
return getGrayLevel(pixel);
}
public int getBlue(int pixel) {
return getGrayLevel(pixel);
}
public int getRGB(int pixel) {
int gray=getGrayLevel(pixel);
return (getAlpha(pixel)<<24)+(gray<<16)+(gray<<8)+gray;
}
}
如果你有自己的算法或者想取得特殊的效果,你可以修改类GrayModel的方法getGrayLevel()。
色彩变换
根据上面的原理,我们也可以实现色彩变换,这样的效果就很多了。下面是一个反转变换的例子:
/* ReverseColorModel.java*/
/*@author:cherami */
/*email:cherami@163.net*/
import java.awt.image.*;
public class ReverseColorModel extends ColorModel {
ColorModel sourceModel;
public ReverseColorModel(ColorModel sourceModel) {
super(sourceModel.getPixelSize());
this.sourceModel=sourceModel;
}
public int getAlpha(int pixel) {
return sourceModel.getAlpha(pixel);
}
public int getRed(int pixel) {
return ~sourceModel.getRed(pixel);
}
public int getGreen(int pixel) {
return ~sourceModel.getGreen(pixel);
}
public int getBlue(int pixel) {
return ~sourceModel.getBlue(pixel);
}
public int getRGB(int pixel) {
return (getAlpha(pixel)<<24)+(getRed(pixel)<<16)+(getGreen(pixel)<<8)+getBlue(pixel);
}
}
/* ReverseColorModel.java*/
/*@author:cherami */
/*email:cherami@163.net*/
import java.awt.image.*;
public class ReverseFilter extends RGBImageFilter {
public ReverseFilter() {
canFilterIndexColorModel=true;
}
public void setColorModel(ColorModel cm) {
substituteColorModel(cm,new ReverseColorModel(cm));
}
public int filterRGB(int x,int y,int pixel) {
return pixel;
}
}
<!---->
<!---->
要想取得自己的效果,需要修改ReverseColorModel.java中的三个方法,getRed、getGreen、getBlue。
下面是上面的效果的一个总的演示程序。
/*GrayImage.java*/
/*@author:cherami */
/*email:cherami@163.net*/
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import java.awt.color.*;
public class GrayImage extends JFrame{
Image source,gray,gray3,clip,bigimg;
BufferedImage bimg,gray2;
GrayFilter filter,filter2;
ImageIcon ii;
ImageFilter cropFilter;
int iw,ih;
public GrayImage() {
ii=new ImageIcon(\"images/11.gif\");
source=ii.getImage();
iw=source.getWidth(this);
ih=source.getHeight(this);
filter=new GrayFilter();
filter2=new GrayFilter(GrayModel.CS_FLOAT);
gray=createImage(new FilteredImageSource(source.getSource(),filter));
gray3=createImage(new FilteredImageSource(source.getSource(),filter2));
cropFilter=new CropImageFilter(5,5,iw-5,ih-5);
clip=createImage(new FilteredImageSource(source.getSource(),cropFilter));
bigimg=source.getScaledInstance(iw*2,ih*2,Image.SCALE_DEFAULT);
MediaTracker mt=new MediaTracker(this);
mt.addImage(gray,0);
try {
mt.waitForAll();
} catch (Exception e) {
}
}
public void paint(Graphics g) {
Graphics2D g2=(Graphics2D)g;
bimg=new BufferedImage(iw, ih, BufferedImage.TYPE_INT_RGB);
Graphics2D srcG = bimg.createGraphics();
RenderingHints rhs = g2.getRenderingHints();
srcG.setRenderingHints(rhs);
srcG.drawImage(source, 0, 0, null);
ColorSpace graySpace=ColorSpace.getInstance(ColorSpace.CS_GRAY);
ColorConvertOp op=new ColorConvertOp(graySpace,rhs);
gray2=new BufferedImage(iw, ih, BufferedImage.TYPE_INT_RGB);
op.filter(bimg,gray2);
g2.drawImage(source,40,40,this);
g2.drawImage(gray,80,40,this);
g2.drawImage(gray2,120,40,this);
g2.drawImage(gray3,160,40,this);
g2.drawImage(clip,40,80,this);
g2.drawImage(bigimg,80,80,this);
}
public void update(Graphics g) {
paint(g);
}
public static void main(String args[]) {
GrayImage m=new GrayImage();
m.setSize(400,400);
m.setVisible(true);
}
}
分享到:
- 2008-12-05 07:48
- 浏览 865
- 评论(0)
- 论坛回复 / 浏览 (0 / 2975)
- 查看更多
相关推荐
### Java 图像处理技巧详解 #### 一、图像剪切技术 在Java中,可以通过`java.awt`和`java.awt.image`包中的类实现图像剪切功能。具体来说,使用`CropImageFilter`类可以非常方便地从一个现有的`Image`对象中截取出...
### Java图像处理技巧详解 #### 一、引言 在Java开发中,图像处理是一项非常实用且常见的功能需求。无论是为了提升用户体验还是实现特定的功能需求,掌握一定的图像处理技巧都是十分必要的。本文将详细介绍Java中...
Java图像处理源代码是关于利用Java编程语言对图像进行各种操作和分析的程序集合。Java提供了丰富的库,如Java Advanced Imaging (JAI) 和 Java 2D API,使得开发人员能够方便地实现图像的读取、显示、编辑、转换以及...
"JAVA基本数字图像处理"这个项目旨在通过Java语言实现一系列基本的图像操作,以帮助开发者理解图像处理的基本原理并掌握其实践技巧。下面将详细介绍这些知识点。 首先,我们要了解数字图像的基础。数字图像实质上是...
在Java编程语言中,图像处理是一项常见的任务,用于创建、编辑或操作图像。这个压缩包包含了一系列实用的Java代码示例,涵盖了多个图像处理的...学习并理解这些基本概念和技巧,能帮助你更好地驾驭Java的图像处理能力。
这个过程中,你不仅会学习到Java编程技巧,还会深入理解数字图像处理的基本原理和算法。通过实践,你将能够熟练地运用这些知识解决实际问题,例如图像识别、医学图像分析、遥感图像处理等领域。
在"Java图像处理"这个项目中,你可能找到了实现这些功能的源代码,通过阅读和理解这些代码,你可以深入学习图像处理的基本原理和Java编程技巧,这对于开发图像处理应用或者进行相关的研究都非常有帮助。同时,这些...
《JAVA实现(JAVA图像处理)》这本书专注于Java语言在图像处理领域的应用,特别是数字水印技术。数字水印是一种将特定信息隐藏在图像中,以保护版权或进行数据验证的技术。书中详细阐述了如何使用Java来实现这一技术...
### Java特效处理技巧详解 #### 一、Java特效概述 Java特效主要指通过Java语言为网页增添动态效果的技术。这些特效通常包括但不限于图片变换、文字动画、3D效果等,可以显著提升网页的视觉吸引力和用户体验。Java...
综上所述,Java图像处理涵盖了图像的读取、显示、颜色调整、滤镜应用、几何变换等多个方面。通过熟练掌握这些技术,开发者可以创建出功能丰富的图像处理程序,满足各种需求。在实际项目中,还可以结合其他库,如...
在本项目中,我们主要探讨的是使用...总的来说,这个项目提供了学习和实践JAVA图像处理,特别是中值滤波的一个实例。通过深入研究提供的代码,你可以掌握图像处理的基本技巧,并可能扩展到其他更复杂的图像处理算法。
在Java数字图像处理领域,编程技巧与应用实践是至关重要的。本书"Java数字图像处理:编程技巧与应用实践源码"旨在将复杂的数字图像处理算法转化为简洁易懂的Java代码,为开发者提供了一条深入理解和应用该技术的道路...
本课程旨在引导学生熟悉Python编程,了解如何利用Python、NumPy和SciPy进行图像处理,并掌握matplotlib进行图像可视化的基本技巧。通过使用spyder IDE,学生将能更高效地完成课程中的练习,提高解决问题的能力。课程...
在图像处理领域,去噪是一项重要的任务,它...总的来说,这个JAVA图像去噪程序提供了学习和研究图像处理的基础,同时也揭示了软件性能优化的重要性。无论是对于学术研究还是实际应用,掌握这些技能都是非常有价值的。
- 通过这个项目,学生不仅能够巩固Java编程基础,还能掌握图形图像处理的基本理论和实践技巧。 - 这样的课程设计有助于提升学生的创新能力,因为他们需要将理论知识转化为实际应用,解决具体问题。 - 通过图像...
4. **图像分析技巧**:探索不同类型的图像处理算法,如边缘检测、形态学操作等,理解其原理并应用到实际问题中。 5. **参与社区**:加入ImageJ和Fiji的用户群组,与其他用户交流经验,获取最新的工具和教程。 总之...
在Java编程领域中,图像处理技术是不可或缺的一部分,它不仅涵盖了基本的图形绘制,如画线、填充多边形等“图形”技术,还包括了图片的变换、显示等更为复杂的“图像”技术。本文将通过分析具体的代码示例,深入探讨...
在这个“J2ME_study_java_图像处理_”的资料包中,我们关注的是在J2ME环境中进行文本和图像处理的编程实践。 在J2ME中,图像处理主要通过` javax.microedition.lcdui.Image`类来实现。这个类提供了创建、加载和操作...
4. **图像处理**: `BufferedImage`类提供了丰富的图像处理方法,如`getRGB()`, `setRGB()`, `createGraphics()`等,可以用于获取像素值、设置像素值以及在图像上进行绘图。`FilteredImageSource`和`ImageFilter`类可...