`

java图片处理 学习

阅读更多

相信大家平时碰到过一些在JAVA中对图像进行处理的需求,比如需要对上传的图片加上自己的签名或图标,或者生成和解析动态的GIF图片,以及处理PSD文件图像信息。本文就JAVA在图像处理中一些基本应用进行了介绍。希望通过能够对大家在以后的图像处理中有些帮助。
一、对一个现有的图片进行文字和图标的合成

我们先从下面的这段简单的代码开始


import java.awt.*;
import javax.imageio.ImageIO;
import java.awt.image.*;
import java.io.*;
import com.sun.image.codec.jpeg.*;
/**
* @author Anders.Hu
* 2005-01-12
*/
public class Test {
public static void main(String[] args) {
 try {
   //读取模板图片内容
   BufferedImage image = ImageIO.read(new FileInputStream("c:\\1.jpg"));
   Graphics2D g = image.createGraphics();//得到图形上下文
   g.setColor(Color.BLACK); //设置画笔颜色
   //设置字体
   g.setFont(new Font("宋体", Font.LAYOUT_LEFT_TO_RIGHT, 15));//写入签名
   g.drawString("很好吃诶,要不要也来一口?",43, image.getHeight() - 10);
   g.dispose();
   FileOutputStream out = new FileOutputStream("c:\\2.jpg");
   JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
   encoder.encode(image);
   out.close();
   } catch(Exception e) {
    e.printStackTrace();
   }
}
}


     相信大家看到这里已经知道了大致的操作过程,我想我还是在这里把基本的原理简单说明一下便于对后续内容的阐述:首先我们通过javax.imageio.ImageIO的read方法读取图像在BufferedImage中,然后我们可以通过BufferedImage的createGraphics方法取得图像的上下文便于对图像的处理,如加上自己喜爱的文字或图片等,最后调用JPEGCodec的encode方法进行JPEG编码,然后就是保存到文件中了。

     需要提出的是JPEGCodec是非标准类,如果程序是运行JDK1.4以上版本的话,可以采取以下代码进行JPEG编码:
            ImageIO.write(image, "JPEG", out);

     可能在你的实际需求还要加入一些图标的修饰,要做到这一步,我们只需要在上面的代码中利用Graphics2D的drawImage方法做到。下面是加入图标的代码


public static void main(String[] args) {
 try {
    BufferedImage image = ImageIO.read(new FileInputStream("c:\\1.jpg"));
    //读取图标
    BufferedImage image_biao = ImageIO.read(new FileInputStream("c:\\i.jpg"));
    Graphics2D g = image.createGraphics();
    g.setColor(Color.YELLOW);
    g.setFont(new Font("宋体", Font.LAYOUT_LEFT_TO_RIGHT, 25));
    g.drawString("很好吃诶,要不要也来一口?",43, image.getHeight() - 80);
    //写入图标
    g.drawImage(image_biao, 20,image.getHeight() - 80, image_biao.getWidth(null),
      image_biao.getHeight(null), null);
    g.dispose();
    FileOutputStream out = new FileOutputStream("c:\\3.jpg");
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
    encoder.encode(image);
    out.close();
   } catch(Exception e) {
    e.printStackTrace();
   }
}
二、生成和解析动态的GIF图片
有了以上对图象的基本处理之后,我们再来看看对动态GIF图片的处理。
GIF是一种由CompuServe创建的压缩和传送图像文件的格式。
GIF图像是基于颜色列表的(存储的数据是该点的颜色对应于颜色列表的索引值),最多只支持8位(256色)。GIF文件内部分成许多存储块,用来存储多幅图像(Frame)或者是决定图像表现行为的控制块,用以实现动画和交互式应用。因此我们要生成和分析GIF图像的话,就需要对GIF文件格式进行分析,这里我们采用网上的一个开源代码进行处理。
先在http://www.fmsware.com/stuff/gif.zip 下载处理GIF图片的代码,解压之后可以发现有AnimatedGifEncoder.java, GifDecoder.java, LZWEncoder.java,NeuQuant.java这4个JAVA文件,在这些文件的开头都已经有了简单的说明。其中AnimatedGifEncoder.是用来生成GIF文件的类,而GifDecoder则是用来解析GIF动态图像Frame信息的类。LZWEncoder是LZW压缩算法类,NeuQuant是用来生成颜色列表的类。
把它们加入到我们的项目文件中,然后我们就来利用AnimatedGifEncoder来写一段合成动态GIF文件的代码。


import java.io.FileInputStream;
import javax.imageio.ImageIO;
import open.AnimatedGifEncoder;
/**
* @author Anders.Hu
* 2005-01-13
*/
public class TestMakeGIF {
public static void main(String[] args) {
 try {
  //指定Frame的文件
  String imgFileName[] = new String[]{"c:\\1.jpg","c:\\2.jpg", "c:\\3.jpg"};
  String outputFileName = "c:\\test.gif";
  AnimatedGifEncoder e = new AnimatedGifEncoder();
  e.start(outputFileName);//开始处理
  e.setDelay(500); //设置延迟时间
  for (int i = 0; i < imgFileName.length; i++) {
   e.addFrame(ImageIO.read(new FileInputStream(imgFileName[i])));//加入Frame
  }
  e.finish();
 } catch (Exception e) {
  e.printStackTrace();
}
}

代码运行的结果如下
是不是觉得有了这个AnimatedGifEncoder类,合成GIF文件挺方便的,现在我们再来看看GifDecoder的使用。


public class TestGifDecoder {
public static void main(String[] args) {
 try {
  String inputFileName = "c:\\test.gif";
  GifDecoder decoder = new GifDecoder();
  decoder.read(inputFileName);
  int n = decoder.getFrameCount();//得到frame的个数
  for (int i = 0; i < n; i++) {
   BufferedImage frame = decoder.getFrame(i); //得到frame
   int delay = decoder.getDelay(i);//得到延迟时间
   //生成JPG文件
   String outFilePath = "c:\\test_"+i+".jpg";
   FileOutputStream out = new FileOutputStream(outFilePath);
   ImageIO.write(frame,"jpeg",out);
  }
 } catch (Exception e) {
  e.printStackTrace();
 }
}
}


代码运行完毕之后,就可以生成了相应的4个jpg文件。
对于以上的代码有下面几点需要补充:
1. 我测试过使用BMP文件的情况,但是没有通过代码的测试,可能是在把BMP图像转为256色图像时出现了错误。所以在使用之前还需要用其他工具把BMP文件转为JPG格式。
2. 在合成GIF文件的AnimatedGifEncoder类中有下面几个值得关注的函数
2.1:setFrameRate(float)每秒种播放的帧数
2.2:setQuality(int quality) 设置在GIF规范中转换为256位图像时的质量参数这个值设置的越小,质量越高,但速度越慢,反之依然,不过超过20以后,速度不会有明显的提升,默认为10。
2.3:setSize(int x,int y) 设置GIF图像的大小,默认值为第一个加入的帧的图像的大小。

三、对PSD图像文件的分析
我们先用PS对模板图片加上一串字符,保存为TestPsd.psd,注意保存时不要合并图层。然后从http://www.fmsware.com/stuff/PSDReader.java 下载一个分析PSD代码的JAVA文件,并加入到我们的项目中。
并运行下面的代码

import java.awt.Point;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import open.PSDReader;
import com.sun.image.codec.jpeg.*;
/**
* @author Ander.Hu
* 2005-10-13
*/
public class TestPsd {
 public static void main(String[] args) {
  try {
  PSDReader r = new PSDReader();
      r.read("c:\\testPsd.psd");
       int n = r.getFrameCount();
       for (int i = 0; i < n; i++) {
          BufferedImage image = r.getLayer(i);
          Point offset = r.getLayerOffset(i);
          //生成JPG文件
    String outFilePath = "c:\\testPsd_"+i+".jpg";
    FileOutputStream out = new FileOutputStream(outFilePath);
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
    encoder.encode(image);
       }
 } catch(Exception e) {
  e.printStackTrace();
 }
}
}


此时我们便可以发现3个解析后的JPG文件,因为包括背景图层在内有3个图层,故有3个JPG文件。 目前PSDReader 类只支持没有压缩过的或者使用RLE压缩的RGB文件,并且也不支持PS3.0以上的特殊功能。
总结
      在JAVA对图像的处理过程中,通常基本步骤是通过读取图像信息到图像缓冲中->同时取得图形上下文->对图像进行相应的处理->生成图像文件

分享到:
评论

相关推荐

    java 图片处理源码

    这是一个Java图片处理程序。 Java 开源代码,高手学习 java 图片处理源码

    Java图像处理类库 Java Image Filters

    在人工智能领域,Java图像处理类库也扮演着重要角色,尤其是在计算机视觉和机器学习应用中。例如,它们可以用于预处理图像数据,以便于训练深度学习模型。开发者可以利用这些库来提取特征、标注图像、识别物体,甚至...

    java处理图片大小等比例缩放,自定义修改图片大小,截取,水印

    在压缩包中的"java图片大小转换"文件中,很可能包含了实现这些功能的示例代码和使用说明,可以参考学习以加深理解。在实际开发中,我们还可以借助第三方库如`ImageMagick`、`Java Advanced Imaging (JAI)`或`JavaFX`...

    java图片处理类-java课程设计

    Java图片处理类是Java编程语言中用于操作和处理图像文件的核心技术,主要涉及Java的AWT(Abstract Window Toolkit)和Swing库。在Java课程设计中,学生通常会被要求掌握这些概念并应用到实际项目中,例如创建一个...

    java图片高级处理(渐变,锐化,边缘检测)

    总的来说,Java图片高级处理涉及多个层次的技术,从简单的颜色变换到复杂的数学算法,都需要扎实的编程基础和对图像处理原理的理解。通过学习和实践,你可以创建出具有独特视觉效果的应用程序或工具,满足各种图像...

    java图片浏览管理系统

    4. **图片处理库**:为了显示和操作图片,系统可能依赖于Java的内置库如Java AWT或第三方库如Apache Commons Imaging(前身是Sanselan)或Java Advanced Imaging (JAI)。这些库提供了读取、解析、转换不同格式图片的...

    java编写的简单图片处理

    综上所述,"java编写的简单图片处理"项目涵盖了基础的Java图像处理技术,包括图像的移动、缩放、2D到3D的转换,以及可能的地图数据处理。这些技能对于开发任何涉及图像显示和编辑的Java应用程序都是必不可少的。通过...

    图片处理程序JAVA源代码

    【标题】"图片处理程序JAVA源代码"是一个适合初学者的项目,旨在通过实际操作来教授Java编程的基础知识,特别是与图像处理相关的技术。在Java中处理图片涉及到多个类库和概念,例如Java的`java.awt`和`javax.imageio...

    java图片灰度处理,java图片去色

    本主题主要关注的是“Java图片灰度处理”和“Java图片去色”这两个知识点。灰度处理和去色是图像处理的基础操作,它们将彩色图像转换为单色调的图像,常用于数据分析、图像压缩或算法开发。 首先,让我们详细了解...

    java tensorflow图片认知学习

    在这个"java tensorflow图片认知学习"的主题中,我们关注的是如何在Java环境中利用TensorFlow进行图像识别。 首先,让我们了解一下TensorFlow的核心概念。TensorFlow的工作基于数据流图,其中节点代表数学操作,边...

    java图片特效处理过滤器

    本项目“java图片特效处理过滤器”提供了一系列的图像特效,如水波纹、高斯模糊和浮雕效果等,为开发者提供了丰富的功能来增强或改变图像的视觉效果。 首先,我们来看一下“水波纹”特效。这种特效通常通过模拟水面...

    java合并图片学习

    在Java编程语言中,合并图片是一项常见的任务,特别是在图像处理、设计或数据分析的场景下。这篇博客"java合并图片学习"提供了一个简单的示例来解释如何在Java中实现这一功能。我们将深入探讨这个主题,包括核心概念...

    java图片编辑工具

    Java图片处理技术是Java编程领域的一个重要分支,它主要涉及Java的AWT(Abstract Window Toolkit)和Swing库,这两个库提供了丰富的图形用户界面组件和图像处理API。例如,`java.awt.image`包包含了用于创建、操作和...

    Java将图片组合成PDF文件的方法

    2. 灵活多样:Java将图片组合成PDF文件的方法可以根据需要选择不同的图片处理方式和PDF文件生成方式,满足不同的需求。 3. 广泛应用:Java将图片组合成PDF文件的方法可以应用于各种领域,如文档处理、图片处理、...

    Java将图片合并为视频

    在Java编程环境中,将一系列图片合并成视频是一个常见的多媒体处理任务。这个项目文件提供了一种实现...通过学习和理解这个项目,你可以掌握Java进行多媒体处理的能力,这对于开发视频编辑、动画制作等应用非常有帮助。

    用JAVA获取视频文件中的帧图片并等比缩放

    * 通过使用Java语言和javacv库,我们可以快速实现图片处理操作。 知识点六:视频处理 * 视频处理是指对视频文件进行各种操作,例如裁剪、合并、压缩等。 * 在视频文件中的帧图片获取后,我们可以对视频文件进行...

    java 图片查看器

    总的来说,这个Java图片查看器项目涵盖了GUI设计、文件I/O、图像处理等多个Java编程的核心概念,对于学习和理解Java图形编程非常有帮助。通过分析和研究这个项目,开发者可以提升自己在Java GUI开发、图像处理等方面...

    Java图片处理

    在Java编程语言中,图片处理是一项常见的任务,广泛应用于各种应用程序,如图形用户界面、图像编辑软件、数据可视化等。本篇文章将深入探讨Java中图片处理的相关知识点,并结合提供的资源"javaImage"来进一步理解。 ...

    用Java实现的图片加密程序

    以上就是关于"用Java实现的图片加密程序"的一些主要知识点,这个项目不仅涉及了Java的IO流技术,还涵盖了加密算法、数据安全等多个方面,对于学习和提升Java编程技能以及信息安全知识非常有帮助。

    基于Java给图片添加文字或图片水印

    在Java编程环境中,给图片添加文字或图片水印是一项常见的图像处理任务,广泛应用于版权保护、品牌宣传等领域。本项目“基于Java给图片添加文字或图片水印”旨在教授如何利用Java实现这一功能,适用于大学生的课程...

Global site tag (gtag.js) - Google Analytics