`
sgm881218
  • 浏览: 58444 次
社区版块
存档分类
最新评论

java实用工具(图片)

    博客分类:
  • java
阅读更多
package com.omg.web.util;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.awt.image.ImageProducer;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;

import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import sun.misc.BASE64Encoder;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class ImageUtil {

private static final Log LOG = LogFactory.getLog(ImageUtil.class);

/**
* 缩放
*
* @param filePath
*            图片路径
* @param savePath
*            保存路径
* @param width
*            宽度
* @param height
*            高度
* @param bb
*            比例不对时是否需要补白
*/
public static void resize(String filePath, String savePath, int width,
int height, boolean bb) {
try {
double ratio = 0.0; // 缩放比例
File f = new File(filePath);
BufferedImage bi = ImageIO.read(f);
Image itemp = bi.getScaledInstance(width, height, bi.SCALE_SMOOTH);
// 计算比例
if ((bi.getHeight() > height) || (bi.getWidth() > width)) {
if (bi.getHeight() > bi.getWidth()) {
ratio = (new Integer(height)).doubleValue()
/ bi.getHeight();
} else {
ratio = (new Integer(width)).doubleValue() / bi.getWidth();
}
AffineTransformOp op = new AffineTransformOp(
AffineTransform.getScaleInstance(ratio, ratio), null);
itemp = op.filter(bi, null);
}
if (bb) {
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
g.setColor(Color.white);
g.fillRect(0, 0, width, height);
if (width == itemp.getWidth(null))
g.drawImage(itemp, 0, (height - itemp.getHeight(null)) / 2,
itemp.getWidth(null), itemp.getHeight(null),
Color.white, null);
else
g.drawImage(itemp, (width - itemp.getWidth(null)) / 2, 0,
itemp.getWidth(null), itemp.getHeight(null),
Color.white, null);
g.dispose();
itemp = image;
}
ImageIO.write((BufferedImage) itemp,
FileUtil.getFileExtention(filePath).substring(1), new File(
savePath));
} catch (Exception e) {
LOG.error(new ImageUtil(), e);
}
}

/**
* 图片处理(只能生产JPG文件)
* 先缩放到规定尺寸,再裁剪多余部分
*
* @param srcFile 源文件路径
* @param smallFile 保存文件路径
* @param width 裁剪的宽度
* @param height 裁剪的高度
*/
public static void cutImage(String srcFile, String smallFile, int width,
int height) {
try {
// 1.获得原始图象Image对象
File file = new File(srcFile);
// baseImage =ImageIO.read(file);
BufferedImage image = ImageIO.read(file);

if (null != image) {
double ratio = 0.0; // 缩放比例

// 计算比例
if ((image.getHeight() > height) || (image.getWidth() > width)) {
if (image.getHeight() < image.getWidth()) {
ratio = (new Integer(height)).doubleValue()
/ image.getHeight();
} else {
ratio = (new Integer(width)).doubleValue() / image.getWidth();
}
AffineTransformOp op = new AffineTransformOp(
AffineTransform.getScaleInstance(ratio, ratio), null);
image = op.filter(image, null);
}

/******************** 文件裁剪 ********************/
// 2.获得剪切后的Image对象
if (width > image.getWidth() && height > image.getHeight()) {
// 如果要求尺寸大于实际尺寸,不做裁剪
FileUtil.copy(file, new File(smallFile));
return;
}

// 大于要求的部分进行裁剪
width = width < image.getWidth() ? width : image.getWidth();
height = height < image.getHeight() ? height : image
.getHeight();

// 根据图像裁剪过滤器产生过滤器
ImageFilter filter = new CropImageFilter(0, 0, width, height);
// 下面根据过滤器产生图像生产者
ImageProducer producer = new FilteredImageSource(
image.getSource(), filter);
// 根据图像生产者产生新图像
Image croppedImage = Toolkit.getDefaultToolkit().createImage(
producer);

// 3.生成图片文件
BufferedImage tag = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(croppedImage, 0, 0, width, height,
null);
FileOutputStream fos = new FileOutputStream(smallFile);
BufferedOutputStream bos = new BufferedOutputStream(fos);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos);
encoder.encode(tag);
bos.close();
}
} catch (Exception e) {
LOG.error(new ImageUtil(), e);
}
}

/**
* 方型图片切割
*
* @param srcFile
*            原图路径
* @param smallFile
*            新图路径
* @throws Exception
*/
public static void cutImage(String srcFile, String smallFile) {
try {
// 1.获得原始图象Image对象
File file = new File(srcFile);
// baseImage =ImageIO.read(file);
BufferedImage image = ImageIO.read(file);

if (null != image) {
// 2.获得剪切后的Image对象
int size = 0;
if (image.getWidth() < image.getHeight()) {
size = image.getWidth();
} else {
size = image.getHeight();
}
// 根据图像裁剪过滤器产生过滤器
ImageFilter filter = new CropImageFilter(0, 0, size, size);
// 下面根据过滤器产生图像生产者
ImageProducer producer = new FilteredImageSource(
image.getSource(), filter);
// 根据图像生产者产生新图像
Image croppedImage = Toolkit.getDefaultToolkit().createImage(
producer);

// croppedImage = cropImage(0, 0, WIDTH, HEIGHT);

// 3.生成图片文件
BufferedImage tag = new BufferedImage(size, size,
BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(croppedImage, 0, 0, size, size,
null);
FileOutputStream fos = new FileOutputStream(smallFile);
BufferedOutputStream bos = new BufferedOutputStream(fos);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos);
encoder.encode(tag);
bos.close();
}
} catch (Exception e) {
LOG.error(new ImageUtil(), e);
}

}

public static void imageCut(String filePath, String savePath)
throws Exception {
FileInputStream is = null;
ImageInputStream iis = null;

try {
// 读取图片文件
is = new FileInputStream(filePath);

/*
* 返回包含所有当前已注册 ImageReader 的 Iterator,这些 ImageReader 声称能够解码指定格式。
* 参数:formatName - 包含非正式格式名称 .(例如 "jpeg" 或 "tiff")等 。
*/
Iterator<ImageReader> it = ImageIO
.getImageReadersByFormatName(FileUtil.getFileExtention(
savePath).substring(1));
ImageReader reader = it.next();
// 获取图片流
iis = ImageIO.createImageInputStream(is);

/*
* <p>iis:读取源.true:只向前搜索 </p>.将它标记为 ‘只向前搜索’。
* 此设置意味着包含在输入源中的图像将只按顺序读取,可能允许 reader 避免缓存包含与以前已经读取的图像关联的数据的那些输入部分。
*/
reader.setInput(iis, true);

/*
* <p>描述如何对流进行解码的类<p>.用于指定如何在输入时从 Java Image I/O
* 框架的上下文中的流转换一幅图像或一组图像。用于特定图像格式的插件 将从其 ImageReader 实现的
* getDefaultReadParam 方法中返回 ImageReadParam 的实例。
*/
ImageReadParam param = reader.getDefaultReadParam();

// 取得图片缩放大小
int size;
BufferedImage bi = ImageIO.read(is);
if (bi.getHeight() > bi.getWidth()) {
size = bi.getWidth();
} else {
size = bi.getHeight();
}
/*
* 图片裁剪区域。Rectangle 指定了坐标空间中的一个区域,通过 Rectangle 对象
* 的左上顶点的坐标(x,y)、宽度和高度可以定义这个区域。
*/
Rectangle rect = new Rectangle(0, 0, size, size);

// 提供一个 BufferedImage,将其用作解码像素数据的目标。
param.setSourceRegion(rect);

/*
* 使用所提供的 ImageReadParam 读取通过索引 imageIndex 指定的对象,并将 它作为一个完整的
* BufferedImage 返回。
*/
bi = reader.read(0, param);

// 保存新图片
ImageIO.write(bi, FileUtil.getFileExtention(savePath).substring(1),
new File(savePath));
} finally {
if (is != null)
is.close();
if (iis != null)
iis.close();
}
}

public static void toJPG(File in, File file) {
try {
BufferedImage buffer = ImageIO.read(in);
buffer.setRGB(0, 0, 0);
ImageIO.write(buffer, "JPEG", file);
} catch (Exception e) {
// TODO: handle exception
}
}

public static void main(String[] args) {
try {
//ImageUtil.resize("f:/logo.tif", "f:/logo.jpg", 100, 100, true);

//ImageUtil.resize("f:/004.jpg", "f:/a_11.jpg", 1280, 960, false);
ImageUtil.cutImage("f:/a.jpg", "f:/a_12.jpg", 640, 480);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
分享到:
评论

相关推荐

    java实用文件小工具

    Java 实用文件小工具是一款专为IT从业者设计的高效文件管理解决方案,它包含了多项实用功能,如文件批量提取、删除以及将Oracle数据库的表结构导出为数据字典。这款工具极大地方便了日常的文件操作和数据库管理工作...

    Java史上最全面的打印工具类,可以打印本、图片、二维码、订单、病历单等等,并且不会出现乱码问题,各种打印排版都可以实现!

    1、java开发必备工具类,兼容了所有版本的JDK,包含了各种类型的打印,可以打印文本、图片、二维码、订单、病历单等信息,应有尽有,功能强大,代码简洁,使用简单,直接拷贝使用即可; 2、本工具类经过了很多项目...

    java图片加水印工具类

    总之,这个“java图片加水印工具类”是一个实用的组件,可以帮助Java开发者轻松地在图片上添加水印,提升工作效率,同时保持代码的整洁和可维护性。无论你是进行个人项目还是企业级应用,它都能成为一个有价值的辅助...

    java编写的图片浏览器

    "图片"标签表示项目与图像处理有关,可能涉及到Java的AWT(Abstract Window Toolkit)或Swing库,它们提供了处理图形用户界面(GUI)和图像的基本工具。“上一张”和“下一张”标签揭示了应用程序的核心功能,即在一...

    Java写的图片幻灯片切换特效Java实用源码整理learns.

    在描述中提到的"Java写的图片幻灯片切换特效Java实用源码整理learns",我们可以理解为这是一份包含Java代码示例的资源,可能包括了不同实现方式的幻灯片切换效果。这些源码可能是基于Swing的JSlider、Timer类,或者...

    基于Java服务端的简单实用图片合成工具设计源码

    ImageCombiner是一款专注于Java服务端图片合成的实用工具,包含41个文件,涵盖17个Java源文件、10个PNG素材文件、3个Markdown文档、3个JavaScript文件等。该工具设计简洁,易于使用,旨在满足日常图片合成的需求。...

    图片缩小工具(java)

    总的来说,“图片缩小工具(java)”是一个基于Java的实用程序,它利用Java的图像处理能力,帮助用户便捷地缩小图片尺寸并减小文件大小。对于开发者来说,理解并掌握Java的图像处理API和技术,可以扩展到更广泛的图像...

    A_jquery+select框图片选择器点击图片给表单select框赋值Java实用源码整理learns

    如果Java在其中发挥作用,可能是通过Ajax技术进行服务器端数据交互,例如获取图片列表或验证用户选择。在提供的压缩包中,可能包含一个Java后台服务,用于处理这些请求。 5. **使用说明**: - `下载及使用说明.txt...

    Java 实用的工具代码可以用eclipse打开

    "Java 实用的工具代码可以用eclipse打开"这个标题表明这是一份与Java工具类库相关的资源,且这些代码可以通过Eclipse这样的集成开发环境(IDE)进行查看和编辑。Eclipse是一款流行的Java IDE,支持代码高亮、自动...

    java开发的微信图片解密工具,亲测有效。

    针对这一问题,Java开发者们设计并实现了解密工具,以帮助用户在离线状态下查看这些加密图片。以下将详细介绍Java开发的微信图片解密工具及其相关知识点。 首先,我们需要理解微信图片的加密原理。微信采用了一种名...

    Java 原生生成表格图片

    总的来说,Java原生生成表格图片是一种实用的技术,虽然相比使用专门的库可能需要更多的编码工作,但它提供了更大的灵活性和自定义空间。通过熟练掌握Java图形2D API,开发者能够创建出满足特定需求的高质量表格图片...

    java实现图片转换为视频

    本篇文章将详细探讨如何使用Java实现图片到视频的转换。 首先,我们需要理解Java中的关键库,如Java Advanced Imaging (JAI) 和 Java Media Framework (JMF)。JAI主要用于图像处理和分析,而JMF则用于媒体播放和...

    java生成二维码工具类(带logo和文字说明) 很实用

    本教程将深入讲解如何使用ZXing库在Java环境中生成带有Logo和文字说明的二维码,并提供一个实用的工具类。 首先,`ZXing`库提供了`com.google.zxing`包,其中包含用于生成二维码的主要类。核心类是`...

    java实现图片转pdf文件

    总的来说,Java结合iText库可以方便地实现图片到PDF的转换,这是一个实用且常见的功能,尤其适合那些需要整理大量图像资料的场景。通过理解和掌握这些知识,你可以灵活地处理各种PDF相关的编程需求。

    s40 5.0版JAVA手机实用工具

    【s40 5.0版JAVA手机实用工具】是一系列专为诺基亚S40第五版手机设计的应用程序,这些工具旨在提高用户在移动设备上的操作效率和便利性。JAVA(Java ME)是一种跨平台的编程语言,广泛应用于移动设备,尤其是非智能...

    java文件对比工具

    Java文件对比工具是一种用于比较两个或多个文件之间差异的实用程序,特别适用于编程环境中检查代码间的相似性或差异。在Java开发中,这样的工具能够帮助开发者有效地定位代码修改的地方,协同工作时解决合并冲突,...

    java图片处理工具类

    通过以上介绍可以看出,`ImageUtils`类为Java开发者提供了一套非常实用且功能全面的图片处理工具。它不仅涵盖了基本的图片处理操作,如缩放、裁剪等,还提供了更为复杂的水印添加功能。这使得开发者能够在不依赖第三...

    java生成1000张图片,分别在每张图片上写阿拉伯数字1~1000

    在Java编程环境中,生成带有阿拉伯数字的图片是一项实用的任务,特别是在网页开发或者自动化测试中,可能需要这样的图像作为标识或顺序指示。以下是如何使用Java来实现这个功能的详细步骤和相关知识点。 首先,我们...

    简单,实用的图片拼接工具

    这个工具可能是用Java语言开发的,因为它涉及到"java util"标签,这通常指的是Java的实用工具类库。 Java的util包是Java标准库的一部分,包含了各种通用的功能,如集合框架、线程管理、日期时间处理等。在图片拼接...

    基于java的网上工具箱

    除了基本的文件管理和FTP功能,【基于Java的网上工具箱】可能还包含其他实用工具,例如文本编辑器、图像查看器、音频播放器等,这些都是基于Java丰富的类库实现的。例如,`javax.swing.JTextArea`和`javax.swing....

Global site tag (gtag.js) - Google Analytics