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 ...
随机推荐
- ASP.NET MVC5 高级编程 第5章 表单和HTML辅助方法
参考资料<ASP.NET MVC5 高级编程>第5版 第5章 表单和HTML辅助方法 5.1 表单的使用 5.1.1 action 和 method 特性 默认情况下,表单发送的是 HTT ...
- The given path's format is not supported.
问题 编程以来今本没有使用input[type=file]这个控件过,今天突然使用尽然报错了,在本地chrome,firefox等其他的浏览器都是好的,唯独ie报错了.在服务器的时候,尽然chrome ...
- POJ C++程序设计 编程题#3 编程作业—文件操作与模板
编程题#3: 整数的输出格式 来源: POJ(Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 1000kB 描述 利 ...
- 开始安装 ASP.NET (4.0.30319.18408)。 出现了错误: 0x8007b799 必须具有此计算机的管理员权限才能运行此工具
在Visual Studio命令提示符安装ASP.NET .出现了错误: 0x8007b799 必须具有此计算机的管理员权限才能运行此工具:如下图: 解决方案如下: 1.打开“C:\Windows\S ...
- 命名空间中的“MvcBuildViews”。 无效
VS2013转VS2010时出现如下错误: 错误提示: 警告 1 元素 命名空间“http://schemas.microsoft.com/developer/msbuild/2003”中的“Prop ...
- Ajax+Asp.Net无刷新分页
1.新建解决方案,并建立四个项目BLL,DAL,Model,PagerTest,如图所示: 2.Model代码 using System; using System.Collections.Gener ...
- mysql查询语句(mysql学习笔记七)
Sql语句 一般顺序GHOL : group by,having ,order by,limit 如果是分组,应该使用对分组字段进行排序的group by语法 ...
- STM32F0xx_SPI读写(Flash)配置详细过程
Ⅰ.概述 关于SPI(Serial Peripheral Interface)串行外设接口可以说是单片机或者嵌入式软件开发人员必须掌握的一项通信方式,就是你在面试相关工作的时候都可能会问及这个问题.在 ...
- linux 修改系统时间
首先进入/proc/sys/xen,执行以下命令 [root@test]#cd /proc/sys/xen[root@test]#echo 1 > independent_wallclock ...
- Multi-Language IDE for Professional Developers (Komodo)
Komodo is the professional IDE for major web languages, including Python, PHP, Ruby, Perl, HTML, CSS ...