`
walksing
  • 浏览: 219165 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

[-Java2D-]Java动态图片处理技术详解 - [Java2D]

阅读更多
[-Java2D-]Java动态图片处理技术详解 - [Java2D]
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://souasou.blogbus.com/logs/32691476.html



使用Java动态处理图片非常方便,可以用于很多应用场合,比如动态输入股市线,缩略图,动态banner图片、动态的界面风格等等。笔者也在软件开发过程中使用了这些技术,使得软件的界面色彩风格可以用户自定义任何一种色彩,大大增强了软件界面的个性化适应能力。下面我对使用Java技术实现图片处理的整个环节做主要说明:

1、图片的装载。我们要处理图片首先要装载图片到Java内存空间的图片对象,Java用很多类来支持图片的装载,比如
         a、根据图片文件字节数组装载图片:
public  Image  loadImage(byte[]  data){
   Image  t=Toolkit.getDefaultToolkit().createImage(data);
   trackImage(t,"装载字节数组图片");
   return  t;
}
         b、根据URL来装载图片:
public  Image  loadImage(String  urlpath){
   Image  t=null;
   if(a  instanceof  Applet){
     try{
       URL  u=getResourceURL(urlpath);
       t=getApplet().getImage(u);
       trackImage(t,urlpath);//检测图片装载过程
     }catch(Exception  e){
       notifyListener(MediaLoadEvent.MEDIA_LOAD_FAILED,false,e.getMessage());//装载失败
     }
   }else{
     t=Toolkit.getDefaultToolkit().getImage(urlpath);
     trackImage(t,urlpath);//检测图片装载过程
   }
   return  t;
}
public  Image  loadImage(String  urlpath,boolean  isurl){
   Image  t=null;
   if(isurl){
     try{
       URL  u=getResourceURL(urlpath);
       t=Toolkit.getDefaultToolkit().getImage(u);
       trackImage(t,urlpath);
     }catch(Exception  e){
       notifyListener(MediaLoadEvent.MEDIA_LOAD_FAILED,false,e.getMessage());//装载失败
     }     
   }else{
     t=Toolkit.getDefaultToolkit().getImage(urlpath);
     trackImage(t,urlpath);//检测图片装载过程
   }
   return  t;
}
2、图片装载完成后,我们可以对图片进行处理,改变色度、亮度、对比度,翻转、镜像等等处理操作。在这里我只详细讲一下最底层的象素变换调整技术,其他很多方法大都是根据这个来封装的。
a、根据制定颜色值和一定范围色差讲图片做透明处理:
public  Image  transpanent(Image  repImage,Color  oldColor,int  errorRange){
   int  w=repImage.getWidth(a);
   int  h=repImage.getHeight(a);
   int[]  imgdata=parImage(repImage,w,h);
   int  rr,gg,bb;
   rr=oldColor.getRed();
   gg=oldColor.getGreen();
   bb=oldColor.getBlue();
   int  offr,offg,offb;
   for(int  i=0;i<h;i++){//逐行扫描
     for(int  j=0;j<w;j++){//逐列扫描
       int  which=i*w+j;
       int  r=((imgdata[which]&0xff0000>>>16));
       int  g=((imgdata[which]&0xff00>>>8));
       int  b=(imgdata[which]&0xff);
       offr=Math.abs(r-rr);
       offg=Math.abs(g-gg);
       offb=Math.abs(b-bb);
       if(offr+offg+offb<errorRange)imgdata[i*w+j]=16777215;
     }
   }
   Image  t=Toolkit.getDefaultToolkit().createImage(new  MemoryImageSource(w,h,imgdata,0,w));
   trackImage(t,"装载透明处理图片");
   return  t;
}
b、对图片做剪切处理,这里使用了图片处理过滤类CropImageFilter,类似的过滤器很多,分别实现不同要求的图片处理变换。
public  Image  crop(int  x,int  y,int  w,int  h  ,Image  img){
   ImageFilter  filter=new  CropImageFilter(x,y,w,h);
   ImageProducer  producer=new  FilteredImageSource(img.getSource(),filter);
   Image  t=a.createImage(producer);
   trackImage(t,"装载剪切图片");
   return  t;
}
3、图片复合和绘制图片:
使用Java的绘图类,可对多个图片进行叠加,并可以自定义绘制各种图形图象,比如实现图片水印、验证码图片,叠加banner图片等。

   public  static  void  createImagePNG(String  signcode,OutputStream  out){
   BufferedImage  offimg=null;
   Graphics  offgra=null;
   while(offimg==null||offgra==null){
     if(offimg==null)offimg=new  BufferedImage(50,18,BufferedImage.TYPE_INT_RGB);
     if(offgra==null&&offimg!=null)offgra=offimg.getGraphics();
   }
   offgra.setColor(new  Color(235,235,235));
   offgra.fillRect(0,0,50,18);
   /*for(int  i=0;i<12;i++){//生成混淆背景,也可用混淆背景图片
     offgra.setColor(Color.decode("#"+color[SystemTool.getRandom(0,color.length-1)]));
     offgra.fillOval(SystemTool.getRandom(0,48),SystemTool.getRandom(0,18),1,1);//10,4);
   }*/
   offgra.setColor(Color.red);
   //offgra.setColor(Color.decode("#"+color[SystemTool.getRandom(0,color.length-1)]));
   try{
     Font  font  =  Font.createFont(Font.TRUETYPE_FONT,com.sunstudio.util.ClassLoaderEx.getResourceInputStream(SystemConfig.getParameter("validate_font")));//  FileInputStream("c:\\\\comicbd.ttf"));
     offgra.setFont(font.deriveFont(Font.BOLD,18F));
   }catch(Exception  e){}
   offgra.drawString(signcode,1,14);
   PngEncoder  png=new  PngEncoder(Toolkit.getDefaultToolkit().createImage(offimg.getSource()),PngEncoder.ENCODE_ALPHA,PngEncoder.FILTER_LAST,3);
   try{out.write(png.pngEncode());}catch(Exception  e){}
   offgra.dispose();
}

4。图片的编码输出:
           Java的图片对象是用于图片装载和处理的数据统一对象,当需要输出到输出设备时需要以指定图片文件格式来编码保存,常见的图片编码器有jpg、 bmp、gif89、gif87、png等等。笔者收集了很多图片格式编码器,如有需要可以和我联系,linlichao@163.com。
           对于输出哪种格式的图片只是编码器不同,过程完全相同,编码器就是按照不同的文件格式的要求对图片对象进行编码输出,这些都是国际标准,我们只需要调用就好了。
PngEncoder  png=new  PngEncoder(Toolkit.getDefaultToolkit().createImage(offimg.getSource()),PngEncoder.ENCODE_ALPHA,PngEncoder.FILTER_LAST,3);
try{out.write(png.pngEncode());}catch(Exception  e){}
分享到:
评论

相关推荐

    Java软件开发实战 Java基础与案例开发详解 14-7 2D图形的绘制 共5页.pdf

    通过上述知识点的学习,不仅可以掌握Java 2D图形的基本概念和实现方法,还能了解到如何将其与其他Java技术相结合,以构建更加丰富和动态的用户界面。这对于从事Java软件开发的人员来说是非常重要的技能之一。

    Java 2D API 中文使用指

    #### 三、Java 2D API 的图像处理功能详解 ##### 3.1 加载和显示图像 Java 2D 提供了 `BufferedImage` 类来加载和处理图像,支持多种图像格式(如 JPEG、PNG)。可以通过 `ImageIO.read()` 方法读取图像文件,并...

    毕业论文设计-IT计算机-java图形图象处理(论文+系统).zip

    2. Java 2D API详解:深入解析Java 2D API的核心类和方法,以及如何使用它们进行图形绘制和图像操作。 3. 图像操作:探讨常见的图像处理操作,如缩放、旋转、裁剪、滤镜效果(模糊、锐化等),以及颜色空间转换。 4....

    3D-JOGL2D.zip

    《JOGL2D在Kotlin中的零开销3D二维渲染技术详解》 在现代的计算机图形学领域,3D建模与渲染是至关重要的技术,广泛应用于游戏开发、3D打印、虚拟现实(VR)等多个领域。JOGL(Java OpenGL Binding)作为一个强大的...

    java2D绘图技术.doc

    ### Java2D绘图技术详解 #### 一、Java2D概述与AWT图形能力的不足 ##### 1. Java2D的推出背景与特点 Java2D API是由Sun Microsystems与Adobe Systems合作推出的,旨在为Java平台提供一个强大的二维图形框架。它是...

    java 2D 绘图技术.doc

    ### Java 2D绘图技术详解 #### 一、引言 随着计算机图形学的发展,图形用户界面(GUI)的设计变得越来越重要。Java作为一种广泛使用的编程语言,在图形处理方面也提供了丰富的API支持。其中,Java 2D API是Java...

    JBox2d详解-目前网上最全

    JBox2d详解-目前网上最全,讲解了java平台下游戏物理引擎的使用

    Java软件开发实战 Java基础与案例开发详解 2-7 java上机练习 共5页.pdf

    10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java...

    Java软件开发实战 Java基础与案例开发详解 3-10 java基础知识章节练习 共4页.pdf

    10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java...

    Java软件开发实战 Java基础与案例开发详解 9-5 java程序国际化的实现 共9页.pdf

    10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java...

    QQ聊天程序详解-JAVA.doc

    QQ聊天程序的开发过程分解为一系列的技术点,这个文档提供了从基础到高级的Java学习路径。以下是基于提供的部分内容解析出的相关知识点: 1. **程序与编程语言**:程序是为解决特定问题而设计的一系列指令,它使得...

    introduction Java 2D(part 1)

    ### Java 2D 知识点详解 #### 一、Java 2D 概述 Java 2D 是 Java 平台的一部分,自 Java 1.2 版本起引入,它提供了一套用于处理复杂二维图形的强大工具集。与早期的 AWT 相比,Java 2D 在许多方面进行了改进,包括...

    imgui-java-main.zip

    《Dear ImGui在Java环境中的应用:ImGui Java详解》 Dear ImGui,作为一个强大的即时模式图形用户界面库,被广泛应用于游戏开发、调试工具、数据分析可视化等领域。它的轻量级设计和高效的性能深受开发者喜爱。而...

    java 生成水印图片

    Java 生成水印图片技术详解 ...Java 生成水印图片技术可以广泛应用于图片保护和图片处理领域,如图片分享、图片编辑和图片识别等。该技术可以保护图片的所有权和确认图片的来源,防止图片被非法使用和篡改。

    box2d中文教程和Jbox2d详解

    通过这个中文教程和JBox2D详解,你可以逐步掌握2D物理引擎的使用,无论是初学者还是有一定经验的开发者,都能从中获得宝贵的知识,提升游戏开发的能力。记得实践是检验真理的唯一标准,动手尝试并不断调试,才能真正...

    puzzle-game-java.2430.zip_made

    2. **动画和图形**:可能使用了Java的绘图API,如Graphics2D,来创建动态的游戏场景和角色动画。 3. **数据结构和算法**:解谜游戏的核心是谜题的设计,这通常涉及到复杂的数据结构(如图、矩阵)和算法(如搜索、...

    Java软件开发实战 Java基础与案例开发详解 11-8 练习题 共5页.pdf

    10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java...

    Java软件开发实战 Java基础与案例开发详解 6-4 访问修饰符 共5页.pdf

    10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java...

    Java软件开发实战 Java基础与案例开发详解 18-6 练习题 共5页.pdf

    10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java...

    Java软件开发实战 Java基础与案例开发详解 17-6 练习题 共4页.pdf

    10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java...

Global site tag (gtag.js) - Google Analytics