java 图片处理
/*
* 图片处理类
*/
package image; import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Transparency;
import java.awt.geom.Area;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO; /**
*
* @author sanshizi
*/
public class ImageUtil { /**
* 针对高度与宽度进行等比缩放
*
* @param img
* @param maxSize 要缩放到的尺寸
* @param type 1:高度与宽度的最大值为maxSize进行等比缩放 , 2:高度与宽度的最小值为maxSize进行等比缩放
* @return
*/
private static Image getScaledImage(BufferedImage img, int maxSize, int type) {
int w0 = img.getWidth();
int h0 = img.getHeight();
int w = w0;
int h = h0;
if (type == 1) {
w = w0 > h0 ? maxSize : (maxSize * w0 / h0);
h = w0 > h0 ? (maxSize * h0 / w0) : maxSize;
} else if (type == 2) {
w = w0 > h0 ? (maxSize * w0 / h0) : maxSize;
h = w0 > h0 ? maxSize : (maxSize * h0 / w0);
}
Image image = img.getScaledInstance(w, h, Image.SCALE_SMOOTH);
BufferedImage result = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = result.createGraphics();
g.drawImage(image, 0, 0, null);//在适当的位置画出
return result;
} /**
* 先按最小宽高为size等比例绽放, 然后图像居中抠出直径为size的圆形图像
*
* @param img
* @param size
* @return
*/
private static BufferedImage getRoundedImage(BufferedImage img, int size) {
return getRoundedImage(img, size, size / 2, 2);
} /**
* 先按最小宽高为size等比例绽放, 然后图像居中抠出半径为radius的圆形图像
*
* @param img
* @param size 要缩放到的尺寸
* @param radius 圆角半径
* @param type 1:高度与宽度的最大值为maxSize进行等比缩放 , 2:高度与宽度的最小值为maxSize进行等比缩放
* @return
*/
private static BufferedImage getRoundedImage(BufferedImage img, int size, int radius, int type) { BufferedImage result = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = result.createGraphics(); //先按最小宽高为size等比例绽放, 然后图像居中抠出直径为size的圆形图像
Image fixedImg = getScaledImage(img, size, type);
g.drawImage(fixedImg, (size - fixedImg.getWidth(null)) / 2, (size - fixedImg.getHeight(null)) / 2, null);//在适当的位置画出 //圆角
if (radius > 0) {
RoundRectangle2D round = new RoundRectangle2D.Double(0, 0, size, size, radius * 2, radius * 2);
Area clear = new Area(new Rectangle(0, 0, size, size));
clear.subtract(new Area(round));
g.setComposite(AlphaComposite.Clear); //抗锯齿
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.fill(clear);
g.dispose();
}
return result;
} /**
* 使用删除alpha值的方式去掉图像的alpha通道
*
* @param $image
* @return
*/
protected static BufferedImage get24BitImage(BufferedImage $image) {
int __w = $image.getWidth();
int __h = $image.getHeight();
int[] __imgARGB = getRGBs($image.getRGB(0, 0, __w, __h, null, 0, __w));
BufferedImage __newImg = new BufferedImage(__w, __h, BufferedImage.TYPE_INT_RGB);
__newImg.setRGB(0, 0, __w, __h, __imgARGB, 0, __w);
return __newImg;
} /**
* 使用绘制的方式去掉图像的alpha值
*
* @param $image
* @param $bgColor
* @return
*/
protected static BufferedImage get24BitImage(BufferedImage $image, Color $bgColor) {
int $w = $image.getWidth();
int $h = $image.getHeight();
BufferedImage img = new BufferedImage($w, $h, BufferedImage.TYPE_INT_RGB);
Graphics2D g = img.createGraphics();
g.setColor($bgColor);
g.fillRect(0, 0, $w, $h);
g.drawRenderedImage($image, null);
g.dispose();
return img;
} /**
* 将32位色彩转换成24位色彩(丢弃Alpha通道)
*
* @param $argb
* @return
*/
public static int[] getRGBs(int[] $argb) {
int[] __rgbs = new int[$argb.length];
for (int i = 0; i < $argb.length; i++) {
__rgbs[i] = $argb[i] & 0xFFFFFF;
}
return __rgbs;
} public static void toJPG(File img, File save, int size, int quality) throws IOException {
FileOutputStream out = new FileOutputStream(save);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); BufferedImage image = (BufferedImage) getRoundedImage(ImageIO.read(img), size, 0, 2);//默认无圆角 //如果图像是透明的,就丢弃Alpha通道
if (image.getTransparency() == Transparency.TRANSLUCENT) {
image = get24BitImage(image);
} JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);//使用jpeg编码器
param.setQuality(1, true);//高质量jpg图片输出
encoder.encode(image, param); out.close();
} public static void toPNG(File img, File save, int size) throws IOException {
ImageIO.write((BufferedImage) getRoundedImage(ImageIO.read(img), size, 0, 2), "PNG", save);//默认无圆角
} public static void main(String[] args) throws IOException {
File img = new File("e:\\Users\\rocky\\Desktop\\0\\IMG_0404.PNG");
File save = new File("e:\\Users\\rocky\\Desktop\\0\\zz.jpg"); toJPG(img, save, 250, 100);
}
}
java 图片处理的更多相关文章
- Atitit.java图片图像处理attilax总结
Atitit.java图片图像处理attilax总结 BufferedImage extends java.awt.Image 获取图像像素点 image.getRGB(i, lineIndex); ...
- Atitit.java图片图像处理attilax总结 BufferedImage extends java.awt.Image获取图像像素点image.getRGB(i, lineIndex); 图片剪辑/AtiPlatf_cms/src/com/attilax/img/imgx.javacutImage图片处理titit 判断判断一张图片是否包含另一张小图片 atitit 图片去噪算法的原理与
Atitit.java图片图像处理attilax总结 BufferedImage extends java.awt.Image 获取图像像素点 image.getRGB(i, lineIndex); ...
- Java 图片提取RGB数组 RGBOfCharMaps (整理)
package demo; /** * Java 图片提取RGB数组 RGBOfCharMaps (整理) * 声明: * 和ImageCombining配合使用的工具,这里是提取图片的R.G.B生成 ...
- Java 图片转换为字符图 CharMaps (整理)
/* * Java 图片转换成字符图 CharMaps (整理) * * 2016-1-2 深圳 南山平山村 曾剑锋 * * @(#)CharMaps.java 2014/1/16 * 1.这个一 ...
- 基于Java图片数据库Neo4j 3.0.0发布 全新的内部架构
基于Java图片数据库Neo4j 3.0.0发布 全新的内部架构 Neo4j 3.0.0 正式发布,这是 Neo4j 3.0 系列的第一个版本.此版本对内部架构进行了全新的设计;提供给开发者更强大的生 ...
- java图片上传(mvc)
最近有开始学起了java,好久没写文章了,好久没来博客园了.最近看了看博客园上次写的图片上传有很多人看,今天在一些篇关于java图片上传的.后台接收用的是mvc.不墨迹了,直接上图. 先看目录结构.i ...
- simpleImageTool又纯java图片水印、缩放工具
simpleImageTool又一个简单.好用的图片格式转换.缩放水印叠加等功能的纯Java图片工具库. simpleImageTool的由来,近期需要用到图片处理,通过网上的图片流直接进行缩放水印叠 ...
- Java 图片处理解决方案:ImageMagick 快速入门
一.ImageMagick介绍 ImageMagick是一个免费的创建.编辑.合成图片的软件,可以实现图片切割.颜色替换.图片缩略图.图片水印等各种效果.ImageMagick是免费开源软件,支持大多 ...
- java图片处理开源框架
java图片处理开源框架 以前一直不明白,java开源框架什么意思,搜集资料得出以下结论 其实java框架可以理解为一个工具或者一个插件,将一个公用的.常用的技术封装起来,处理一些基础的.繁琐的问题. ...
- Java图片加文字水印
Java图片加文字水印 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.I ...
随机推荐
- UML类图与类的关系详解
摘自:http://www.uml.org.cn/oobject/201104212.asp UML类图与类的关系详解 2011-04-21 来源:网络 在画类图的时候,理清类和类之间的关系是重点.类 ...
- Unieap3.5-前台js判断表单必录
//用户信息字段检查 var custFrm=unieap.byId('custFrm'); var isValid=custFrm.validate(true); if(!isValid){ ret ...
- 关于使用SVN update时出现:E155004错误
今天早上到公司开了电脑,准备update下SVN的代码,但是在update时出现svn: E155004: Working copy 'E:\XX' locked 错误,乍眼一看以为是什么配置出错, ...
- JavaScript API 设计原则
网+线下沙龙 | 移动APP模式创新:给你一个做APP的理由>> 好的 API 设计:在自描述的同时,达到抽象的目标. 设计良好的 API ,开发者可以快速上手,没必要经常抱着手册和文档, ...
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(四)-- Middleware
本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Middleware功能支持. 在演示Middleware功能之前,先要了解一下Asp ...
- xode View 的封装
1.Xcode自带头文件的路径 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Develo ...
- C#语法基础和面向对象编程
1.C#语法基础 http://www.cnblogs.com/tonney/archive/2011/03/16/1986456.html 2.C#与面向对象基础 很棒的资源,简明扼要,介绍的非常清 ...
- sqoop的eval工具
eval的作用:Evaluate a SQL statement and display the results,也就是说eval像是一个数据库的客户端工具. 一.使用eval来查询表 $ sqoop ...
- qemu-kvm简单使用
qemu-kvm主要有以下几个选项: -snapshot: 创建快照 -m: 指定内存大小 -smp: 指定处理器个数 -cpu: 指定CPU类型 -name: 设置虚拟机名称 -vnc: 使用vnc ...
- js浏览器各种位置检测
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...