package com.zhangjun.image; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Iterator; import javax.imageio.ImageIO; import javax.imageio.ImageReadParam; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; public class OperateImage { // ===源图片路径名称如:c:\1.jpg private String srcpath; // ===剪切图片存放路径名称。如:c:\2.jpg private String subpath; // ===剪切点x坐标 private int x; private int y; // ===剪切点宽度 private int width; private int height; public OperateImage() { } public OperateImage(int x, int y, int width, int height) { this.x = x; this.y = y; this.width = width; this.height = height; } /** * 对图片裁剪,并把裁剪完的新图片保存 。 */ public void cut() throws IOException { FileInputStream is = null; ImageInputStream iis = null; try { // 读取图片文件 is = new FileInputStream(srcpath); /** * 返回包含所有当前已注册 ImageReader 的 Iterator,这些 ImageReader * 声称能够解码指定格式。 参数:formatName - 包含非正式格式名称 . * (例如 "jpeg" 或 "tiff")等 。 */ Iterator<ImageReader> it = ImageIO .getImageReadersByFormatName("jpg"); ImageReader reader = it.next(); // 获取图片流 iis = ImageIO.createImageInputStream(is); /** * iis:读取源。true:只向前搜索 * 将它标记为 ‘只向前搜索’。 * 此设置意味着包含在输入源中的图像将只按顺序读取,可能允许 reader * 避免缓存包含与以前已经读取的图像关联的数据的那些输入部分。 */ reader.setInput(iis, true); /** * <p> * 描述如何对流进行解码的类 * <p> * 用于指定如何在输入时从 Java Image I/O * 框架的上下文中的流转换一幅图像或一组图像。用于特定图像格式的插件 * 将从其 ImageReader 实现的 getDefaultReadParam 方法中返回 * ImageReadParam 的实例。 */ ImageReadParam param = reader.getDefaultReadParam(); /** * 图片裁剪区域。Rectangle 指定了坐标空间中的一个区域,通过 Rectangle 对象 * 的左上顶点的坐标(x,y)、宽度和高度可以定义这个区域。 */ Rectangle rect = new Rectangle(x, y, width, height); // 提供一个 BufferedImage,将其用作解码像素数据的目标。 param.setSourceRegion(rect); /** * 使用所提供的 ImageReadParam 读取通过索引 imageIndex 指定的对象,并将 * 它作为一个完整的 BufferedImage 返回。 */ BufferedImage bi = reader.read(0, param); // 保存新图片 ImageIO.write(bi, "jpg", new File(subpath)); } finally { if (is != null) is.close(); if (iis != null) iis.close(); } } public int getHeight() { return height; } public void setHeight(int height) { this.height = height; } public String getSrcpath() { return srcpath; } public void setSrcpath(String srcpath) { this.srcpath = srcpath; } public String getSubpath() { return subpath; } public void setSubpath(String subpath) { this.subpath = subpath; } public int getWidth() { return width; } public void setWidth(int width) { this.width = width; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public static void main(String[] args) throws Exception { String name = "D:\\image.jpg"; OperateImage o = new OperateImage(60, 5, 80, 100); o.setSrcpath(name); o.setSubpath("F:\\3.jpg"); o.cut(); } }
最近下载更多
shiropurple LV2
2022年5月8日
小乖乖的欢% LV1
2021年5月22日
2336727531 LV1
2021年1月16日
输入的V领会计 LV2
2020年8月12日
scy196 LV1
2020年8月11日
13925697941 LV1
2020年5月13日
jiaowoyuege LV11
2019年12月31日
sakuras LV2
2019年7月8日
wuziqi88 LV2
2019年6月11日
rp2012 LV2
2019年4月26日
最近浏览更多
DongYingdie LV2
2023年12月21日
dxn111
2022年11月28日
暂无贡献等级
2470505117 LV2
2022年9月28日
shiropurple LV2
2022年5月8日
小乖乖的欢% LV1
2021年5月22日
羞羞小子 LV13
2021年4月9日
2336727531 LV1
2021年1月16日
said_what LV3
2020年9月24日
w19991213 LV2
2020年9月21日
输入的V领会计 LV2
2020年8月12日