java图片裁剪和java生成缩略图
java实现图片像素质量压缩与图片长宽缩放

java实现图⽚像素质量压缩与图⽚长宽缩放⽬录java 图⽚像素质量压缩与图⽚长宽缩放java 修改图⽚dpi(像素/⼤⼩)java 图⽚像素质量压缩与图⽚长宽缩放今天找到的这个⽅法⽐以前项⽬⽤到的⽅法更好,这⾥记录下,⽅便⽇后使⽤!/*** 缩放图⽚(压缩图⽚质量,改变图⽚尺⼨)* 若原图宽度⼩于新宽度,则宽度不变!* @param newWidth 新的宽度* @param quality 图⽚质量参数 0.7f 相当于70%质量* 2015年12⽉11⽇*/public static void resize(File originalFile, File resizedFile,int newWidth, float quality) throws IOException {if (quality > 1) {throw new IllegalArgumentException("Quality has to be between 0 and 1");}ImageIcon ii = new ImageIcon(originalFile.getCanonicalPath());Image i = ii.getImage();Image resizedImage = null;int iWidth = i.getWidth(null);int iHeight = i.getHeight(null);if(iWidth < newWidth){newWidth = iWidth;}if (iWidth > iHeight) {resizedImage = i.getScaledInstance(newWidth, (newWidth * iHeight)/ iWidth, Image.SCALE_SMOOTH);} else {resizedImage = i.getScaledInstance((newWidth * iWidth) / iHeight,newWidth, Image.SCALE_SMOOTH);}// This code ensures that all the pixels in the image are loaded.Image temp = new ImageIcon(resizedImage).getImage();// Create the buffered image.BufferedImage bufferedImage = new BufferedImage(temp.getWidth(null),temp.getHeight(null), BufferedImage.TYPE_INT_RGB);// Copy image to buffered image.Graphics g = bufferedImage.createGraphics();// Clear background and paint the image.g.setColor(Color.white);g.fillRect(0, 0, temp.getWidth(null), temp.getHeight(null));g.drawImage(temp, 0, 0, null);g.dispose();// Soften.float softenFactor = 0.05f;float[] softenArray = { 0, softenFactor, 0, softenFactor,1 - (softenFactor * 4), softenFactor, 0, softenFactor, 0 };Kernel kernel = new Kernel(3, 3, softenArray);ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);bufferedImage = cOp.filter(bufferedImage, null);// Write the jpeg to a file.FileOutputStream out = new FileOutputStream(resizedFile);// Encodes image as a JPEG data streamJPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bufferedImage);param.setQuality(quality, true);encoder.setJPEGEncodeParam(param);encoder.encode(bufferedImage);} // Example usagepublic static void main(String[] args) throws IOException {// File originalImage = new File("C:\\11.jpg");// resize(originalImage, new File("c:\\11-0.jpg"),150, 0.7f);// resize(originalImage, new File("c:\\11-1.jpg"),150, 1f);File originalImage = new File("d:\\testImg\\1.jpg");System.out.println("源⽂件⼤⼩" + originalImage.length());// File resizedImg = new File("d:\\testImg\\11.jpg");// resize(originalImage, resizedImg, 850, 1f);// System.out.println("0.5转换后⽂件⼤⼩" + resizedImg.length());// File resizedImg1 = new File("d:\\testImg\\111.jpg");File resizedImg1 = new File("/alidata/zkyj/dashixiong/tempImgFile/11.jpg");resize(originalImage, resizedImg1, 1550, 0.7f);System.out.println("0.7转换后⽂件⼤⼩" + resizedImg1.length());}java 修改图⽚dpi(像素/⼤⼩)import com.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGEncodeParam;import com.sun.image.codec.jpeg.JPEGImageEncoder;import javax.imageio.ImageIO;import java.awt.image.BufferedImage;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;public class DPIHandleHelper {private static int DPI = 300;public static void main(String[] args) {String path = "C:\\test.jpg";File file = new File(path);handleDpi(file, 300, 300);}/*** 改变图⽚DPI** @param file* @param xDensity* @param yDensity*/public static void handleDpi(File file, int xDensity, int yDensity) {try {BufferedImage image = ImageIO.read(file);JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(new FileOutputStream(file)); JPEGEncodeParam jpegEncodeParam = jpegEncoder.getDefaultJPEGEncodeParam(image);jpegEncodeParam.setDensityUnit(JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH);jpegEncoder.setJPEGEncodeParam(jpegEncodeParam);jpegEncodeParam.setQuality(0.75f, false);jpegEncodeParam.setXDensity(xDensity);jpegEncodeParam.setYDensity(yDensity);jpegEncoder.encode(image, jpegEncodeParam);image.flush();} catch (IOException e) {e.printStackTrace();}}}以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
java中图片上传+预览+剪切解决方案

java中图片上传+预览+剪切解决方案我们在很多网站可以看到上传图片后可以剪切,下面我来介绍一个java中图片上传+预览+剪切解决方案吧,有需要的朋友可参考参考。
表现流程如下:步骤1:点击浏览按钮选中图片-------1------>onchange事件把图片上传到服务器-------2----->图片路径回传步骤2:进入切割图片------3----->切割,取得坐标,长度--------4---->传给服务器---------->后台切割产生新图片-----5------>回传新图路径步骤3:页面截图预览步骤1:file标签:onchange事件调用的js方法:ajaxFileUpload利用iframe模拟了ajax上传文件。
url:"uploadPreviewImage.html" 就是后台地址,(本人使用的是spring mvc),success:function (data , status),上传成功后调用的js中,$('#photo').imgAreaSelect方法是使用了imgAreaSelect插件来初始化截图界面。
官网地址:/projects/imgareaselect/关于ajaxFileUpload的api可以查看官网,开始的时候我使用的是网上随便下的一个js,发现一直调不同,最后换了官网的,才ok。
var f=document.getElementById("advImage").value;if(!/.(gif|jpg|jpeg|png|JPG|PNG)$/.test(f)){alert("图片类型必须是.jpeg,jpg,png中的一种")return false;}// 利用ajaxFileUpload js 插件上传图片$.ajaxFileUpload({url:"uploadPreviewImage.html",secureuri:false,fileElementId:"advImage",dataType:"json",success:function (data , status) {//上传成功后,直接跳出截图框,使用imgAreaSelect插件piso = $('#photo').imgAreaSelect({x1: 0, y1: 0, x2:480 , y2: 520 ,onSelectEnd: preview,resizable: false,instance: true,persistent:true});// 这个方法是现实一个div,托住截图框showCutImage();// 一些变量在页面的隐藏input的设置document.getElementById("photo").src = data.tempPath;document.getElementById("currentPath").valu e = data.tempPath;},error:function (data, status, e) {//alert("图片上传失败,请重新选择图片");}});return false;}// 截图选中后调用方法,保存好起始坐标和宽高function preview(img, selection){$('#x1').val(selection.x1);$('#y1').val(selection.y1);$('#x2').val(selection.x2);$('#y2').val(selection.y2);$('#w').val(selection.width);$('#h').val(selection.height);} uploadPreviewImage方法,把文件方法零时文件夹下:public ModelAndView uploadPreviewImage(HttpServletRequest request, HttpServletResponse response) throws IOException{User user = (User)request.getSession().getAttribute("user");MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)request;MultipartFile image = multipartRequest.getFile("advImage");response.setCharacterEncoding(BusinessConstants.ENC OD_UTF);response.setHeader("ContentType", "json");PrintWriter out = response.getWriter();// 组合零时图片名String imageName = image.getOriginalFilename();String file_ext = imageName.substring(stIndexOf(BusinessConstants.DOT) + 1);SimpleDateFormat df = new SimpleDateFormat(BusinessConstants.DATE_FORMAT);String tempImageName = user.getId() +BusinessConstants.UNDERLINE + df.format(new Date()) + BusinessConstants.DOT + file_ext;// 存放浏览图片的零时文件路径File file = new File(request.getSession().getServletContext().getRealPath(Business Constants.TEMP_PICTURE_PATH +tempImageName));byte[] advImageBytes = null;InputStream advImageStream = null;try {file.createNewFile();advImageStream = image.getInputStream();advImageBytes = FileCopyUtils.copyToByteArray(advImageStream);FileCopyUtils.copy(advImageBytes, file);advImageStream.close();} catch (IOException e) {e.printStackTrace();}String tempPath = BusinessConstants.TEMP_RELATIVE_PICTURE_PATH +tempImageName;// 传给页面相对路径out.print("{");out.print("tempPath:'"+tempPath+"',");out.print("msg:''");out.print("}");out.flush();out.close();// ajaxreturn null;}上面的uploadPreviewImage调用完成后就会把下面的div显示出来(初始隐藏):这就是截图界面啦!<input id="h" type="hidden" /></div><input type="button" id="cutImage" name="cutImage" class="btton-queren" onclick="cutImage()" style="float: right;" value="保存"/></div>步骤2:我们可以看到截图完毕后点击保存,就会调用cutImage方法:里面我们利用dwr调用ReleaseService的cutImage方法。
JAVA生成缩略小图片类

boolean proportion=true; //是否等比缩放标记(默认为等比缩放)
public Small_pic(){
//初始化变量
InputDir="";
OutputDir="";
InputFileName="";
OutputFileName="";
this.OutputHeight=OutputHeight;
}
public void setW_H(int width,int height){
this.OutputWidth=width;
this.OutputHeight=height;
}
public String s_pic(){
this.InputDir=InputDir;
//输出图路径
this.OutputDir=OutputDir;
//输入图文件名
this.InputFileName=InputFileName;
//输出图文件名
this.OutputFileName=OutputFileName;
//设置图片长宽
* 本java类能将jpg图片文件,进行等比或非等比的大小转换
* 具体使用方法
* s_pic(大图片路径,生成小图片路径,大图片文件名,生成小图片文名,生成小图片宽度,生成小图片高度,是否等比缩放(默认为true))
*/
public class Small_pic{
String InputDir; //输入图路径
encoder.encode(buffImg);
Java图像编辑器

Java图像编辑器- 允许用户打开、编辑和保存图像文件在本博客中,我们将创建一个基本的Java图像编辑器,它允许用户打开、编辑和保存图像文件。
这个图像编辑器将使用Java的Swing库来构建用户界面,并使用Java的ImageIO库来处理图像文件。
目录简介项目设置构建用户界面打开图像文件编辑图像保存图像文件运行图像编辑器总结1. 简介图像编辑器是一个常见的应用程序,用于处理和修改图像文件。
本项目将展示如何使用Java编写一个基本的图像编辑器,其中包括以下功能:打开图像文件:用户可以打开现有的图像文件。
编辑图像:用户可以进行基本的图像编辑,如裁剪、旋转和调整亮度/对比度。
保存图像文件:用户可以保存编辑后的图像为新文件。
我们将使用Java的Swing库构建用户界面,并使用Java 的ImageIO库来处理图像文件。
2. 项目设置首先,您需要准备好Java开发环境。
您可以安装JDK(Java Development Kit)并设置Java编程环境。
确保您的开发环境可以编译和运行Java应用程序。
接下来,创建一个新的Java项目,并确保您的项目包含Swing库和ImageIO库。
这两个库在Java标准库中,通常不需要额外安装。
3. 构建用户界面在我们开始编写Java代码之前,让我们首先构建用户界面。
我们将使用Swing库来创建一个简单的图像编辑器窗口,其中包括菜单栏、工具栏和图像显示区域。
javaCopy codeimport javax.swing.*;import java.awt.*;public class ImageEditor extends JFrame {private JMenuBar menuBar;private JMenu fileMenu;private JMenuItem openMenuItem;private JMenuItem saveMenuItem;private JToolBar toolBar;private JButton cropButton;private JButton rotateButton;private JButton brightnessButton;private JLabel imageLabel;public ImageEditor() {setTitle("Java图像编辑器");setSize(800, 600); setDefaultCloseOperation(EXIT_ON_CLOSE);menuBar = new JMenuBar();fileMenu = new JMenu("文件"); openMenuItem = new JMenuItem("打开"); saveMenuItem = new JMenuItem("保存"); fileMenu.add(openMenuItem);fileMenu.add(saveMenuItem);menuBar.add(fileMenu);setJMenuBar(menuBar);toolBar = new JToolBar();cropButton = new JButton("裁剪"); rotateButton = new JButton("旋转"); brightnessButton = new JButton("亮度/对比度"); toolBar.add(cropButton);toolBar.add(rotateButton);toolBar.add(brightnessButton);add(toolBar, BorderLayout.NORTH);imageLabel = new JLabel();add(imageLabel, BorderLayout.CENTER);}public static void main(String[] args) {SwingUtilities.invokeLater(() -> {ImageEditor editor = new ImageEditor();editor.setVisible(true);});}}以上代码创建了一个ImageEditor类,该类继承自JFrame,并包含菜单栏、工具栏和图像显示区域。
图片裁剪(java版)

图片裁剪(java版)图片裁剪(java版)一、功能说明1. 图片裁剪,矩形方式裁剪原图的某一部分2. 可设置裁剪的起始位置,左边距和上边距(默认为0)3. 可设置裁剪的宽高(默认为原始尺寸- 裁剪起始位置) 5. 注意事项. 图片输出到本地. 为防止内存溢出,请增大jvm内存(推荐-Xmx1024m). 可处理20M左右(10000 ×10000)超高清图片二、代码1.原代码import java.awt.Graphics;import java.awt.Image;import java.awt.Toolkit;import java.awt.image.BufferedImage;import java.awt.image.CropImageFilter;import java.awt.image.FilteredImageSource;import java.awt.image.ImageFilter;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import javax.imageio.stream.ImageInputStream;import com.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGImageEncoder;/*** 图片截剪*图片输出到本地.*gif 图片只输出第一帧图片.*为防止内存溢出,请增大jvm内存(推荐-Xmx1024m). *可处理20M左右大图片.** @author lily200825* @date 2011-6-1*/public class ImageCutUtil {// 输出打印日志public static boolean IS_DEBUG = true;/**** @param srcImg* 原图片路径* 输出图片路径* @param left* 左边距* @param top* 上边距* @param width* 截剪宽度* @param height* 截剪高度* @return* @throws IOException*/public static boolean cutImage(String srcImg, String destImg, int left,int top, Integer width, Integer height) throws IOException {if (destImg == null || destImg.trim().length() == 0) {if (IS_DEBUG) {System.err.println("图片截剪:输出图片路径[" + destImg + "]错误。
java处理图片按比例缩放功能

java处理图⽚按⽐例缩放功能java中的图⽚按⽐例缩放功能1. 按固定长宽进⾏缩放/** 图⽚缩放,w,h为缩放的⽬标宽度和⾼度* src为源⽂件⽬录,dest为缩放后保存⽬录*/public static void zoomImage(String src,String dest,int w,int h) throws Exception {double wr=0,hr=0;File srcFile = new File(src);File destFile = new File(dest);BufferedImage bufImg = ImageIO.read(srcFile); //读取图⽚Image Itemp = bufImg.getScaledInstance(w, h, bufImg.SCALE_SMOOTH);//设置缩放⽬标图⽚模板wr=w*1.0/bufImg.getWidth(); //获取缩放⽐例hr=h*1.0 / bufImg.getHeight();AffineTransformOp ato = new AffineTransformOp(AffineTransform.getScaleInstance(wr, hr), null);Itemp = ato.filter(bufImg, null);try {ImageIO.write((BufferedImage) Itemp,dest.substring(stIndexOf(".")+1), destFile); //写⼊缩减后的图⽚} catch (Exception ex) {ex.printStackTrace();}}2. 按固定⽂件⼤⼩进⾏缩放/** 图⽚按⽐率缩放* size为⽂件⼤⼩*/public static void zoomImage(String src,String dest,Integer size) throws Exception {File srcFile = new File(src);File destFile = new File(dest);long fileSize = srcFile.length();if(fileSize < size * 1024) //⽂件⼤于size k时,才进⾏缩放,注意:size以K为单位return;Double rate = (size * 1024 * 0.5) / fileSize; // 获取长宽缩放⽐例BufferedImage bufImg = ImageIO.read(srcFile);Image Itemp = bufImg.getScaledInstance(bufImg.getWidth(), bufImg.getHeight(), bufImg.SCALE_SMOOTH);AffineTransformOp ato = new AffineTransformOp(AffineTransform.getScaleInstance(rate, rate), null);Itemp = ato.filter(bufImg, null);try {ImageIO.write((BufferedImage) Itemp,dest.substring(stIndexOf(".")+1), destFile);} catch (Exception ex) {ex.printStackTrace();}}。
java生成缩略图

最近公司说要在portal中添加一个上传图片并生成缩略图的方法,试了很久,终于搞定了;写下点心得吧,使大家少走弯路;首先做之前,google了一下,发现很多生产缩略图的方法:Java代码1.BufferedImage img = ImageIO.read(file);2. int h = img.getHeight();3. int w = img.getWidth();4.5. if(h>=96 && w >=96){6. int nw = 96;7. int nh = (nw * h) / w;8. if(nh>96) {9. nh = 96;10. nw = (nh * w) / h;11. }12. ByteArrayOutputStream out = new ByteArrayOutputStream();13. BufferedImage dest = new BufferedImage(nw,nh, BufferedImage.TYPE_INT_RGB);14. dest.getGraphics().drawImage(img,0,0,nw, nh,null);15. ImageIO.write(dest, "jpeg", out);16. imageThumbnail = out.toByteArray();17. }18. else{19. imageThumbnail = imageData;20. }但是使用后发现,对于底色是透明的图片,生成的缩略图是别的颜色的,于是找原因,发现jpeg是最大的祸首;现在修改代码:Java代码1.BufferedImage img = ImageIO.read(file);2. int h = img.getHeight();3. int w = img.getWidth();4.5. if(h>=96 && w >=96){6. int nw = 96;7. int nh = (nw * h) / w;8. if(nh>96) {9. nh = 96;10. nw = (nh * w) / h;11. }12. ByteArrayOutputStream out = new ByteArrayOutputStream();13. BufferedImage dest = new BufferedImage(nw,nh,BufferedImage.TYPE_4BYTE_ABGR);14. dest.getGraphics().drawImage(img,0,0,nw, nh,null);15. GifEncoder.encode(dest, out);16. //ImageIO.write(dest, "gif", out);17. imageThumbnail = out.toByteArray();18. }19. else{20. imageThumbnail = imageData;21. }其中使用了GifEncoder这也类,对应的jar包就是gif89.jar,这是个开源的包,做了修改,去掉了恶心的公司logo,现在生成的缩略图没有问题了,连gif 的动画也能缩略,强啊用Java缩小一个股票图片总是失真,造成了好多锯齿状,文字不清晰,K图也断断续续的了。
Java实现图片压缩代码,图片大小转换

Java实现图⽚压缩代码,图⽚⼤⼩转换在很多项⽬中我们会把上传的图⽚做处理,⽐较图⽚上传过多对服务器的容量和带宽有很多的浪费,如果不是必须的⾼清图⽚,我们可以通过代码来做压缩。
在我的项⽬中我们压缩图⽚的⽬的是让web页⾯打开的速度很快,并且节省空间。
下⾯先分享⼀下代码:package org.util;import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;import java.awt.image.CropImageFilter;import java.awt.image.FilteredImageSource;import java.awt.image.ImageFilter;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;public class ImgTools {/*** 按照宽⾼⽐例压缩** @param img* @param width* @param height* @param out* @throws IOException*/public static void thumbnail_w_h(File img, int width, int height,OutputStream out) throws IOException {BufferedImage bi = ImageIO.read(img);double srcWidth = bi.getWidth(); // 源图宽度double srcHeight = bi.getHeight(); // 源图⾼度double scale = 1;if (width > 0) {scale = width / srcWidth;}if (height > 0) {scale = height / srcHeight;}if (width > 0 && height > 0) {scale = height / srcHeight < width / srcWidth ? height / srcHeight: width / srcWidth;}thumbnail(img, (int) (srcWidth * scale), (int) (srcHeight * scale), out);}/*** 按照固定宽⾼原图压缩** @param img* @param width* @param height* @param out* @throws IOException*/public static void thumbnail(File img, int width, int height,OutputStream out) throws IOException {BufferedImage BI = ImageIO.read(img);Image image = BI.getScaledInstance(width, height, Image.SCALE_SMOOTH);BufferedImage tag = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);Graphics g = tag.getGraphics();g.setColor(Color.RED);g.drawImage(image, 0, 0, null); // 绘制处理后的图g.dispose();ImageIO.write(tag, "JPEG", out);}/*** 按照宽⾼裁剪** @param srcImageFile* @param destWidth* @param destHeight* @param out*/public static void cut_w_h(File srcImageFile, int destWidth,int destHeight, OutputStream out) {cut_w_h(srcImageFile, 0, 0, destWidth, destHeight, out);}public static void cut_w_h(File srcImageFile, int x, int y, int destWidth,int destHeight, OutputStream out) {try {Image img;ImageFilter cropFilter;// 读取源图像BufferedImage bi = ImageIO.read(srcImageFile);int srcWidth = bi.getWidth(); // 源图宽度int srcHeight = bi.getHeight(); // 源图⾼度if (srcWidth >= destWidth && srcHeight >= destHeight) {Image image = bi.getScaledInstance(srcWidth, srcHeight,Image.SCALE_DEFAULT);cropFilter = new CropImageFilter(x, y, destWidth, destHeight);img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(image.getSource(), cropFilter));BufferedImage tag = new BufferedImage(destWidth, destHeight,BufferedImage.TYPE_INT_RGB);Graphics g = tag.getGraphics();g.drawImage(img, 0, 0, null); // 绘制截取后的图g.dispose();// 输出为⽂件ImageIO.write(tag, "JPEG", out);}} catch (Exception e) {e.printStackTrace();}}// #cut_w_hpublic static void main(String[] args) throws IOException {File img = new File("e:\\a\\a.jpg");FileOutputStream fos = new FileOutputStream("e:\\a\\b.jpg");// ImgTools.thumbnail(img, 100, 100, fos);// ImgTools.cut_w_h(img, 230, 200, fos);ImgTools.thumbnail_w_h(img, 100, 0, fos);}}其实我们很多⼈喜欢在上传的时候就做了限制了,这样在上传时就节省了带宽,可是很多客户是不会做图⽚处理的,5M的⼤图直接就给你上传,限制了说我们做的不⼈性化。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if (suffix == null || types.toLowerCase().indexOf(suffix.toLowerCase() + ",") < 0) { log.error("Sorry, the image suffix is illegal. the standard image suffix is {}."+ types); return; } // 将FileInputStream 转换为ImageInputStream iis = ImageIO.createImageInputStream(fis); // 根据图片类型获取该种类型的ImageReader ImageReader reader = ImageIO.getImageReadersBySuffix(suffix).next(); reader.setInput(iis, true); ImageReadParam param = reader.getDefaultReadParam(); ceRegion(rect); BufferedImage bi = reader.read(0, param); ImageIO.write(bi, suffix, output); ("图片生成成功,请到目录下查看"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (fis != null) fis.close(); if (iis != null) iis.close(); } catch (IOExcep(); } } } else { log.warn("the src image is not exist."); } }
// 获取图片后缀 if(imgFile.getName().indexOf(".") > -1) { suffix = imgFile.getName().substring(imgFile.getName().lastIndexOf(".") + 1); }// 类型和图片后缀全部小写,然后判断后缀是否合法 if(suffix == null || types.toLowerCase().indexOf(suffix.toLowerCase()) < 0){ log.error("Sorry, the image suffix is illegal. the standard image suffix is {}." + types); return ; } log.debug("target image's size, width:{}, height:{}.",w,h); Image img = ImageIO.read(imgFile); if(!force){ // 根据原图与要求的缩略图比例,找到最合适的缩略图比例 int width = img.getWidth(null); int height = img.getHeight(null); if((width*1.0)/w < (height*1.0)/h){ if(width > w){ h = Integer.parseInt(new java.text.DecimalFormat("0").format(height * w/(width*1.0))); log.debug("change image's height, width:{}, height:{}.",w,h); } } else { if(height > h){ w = Integer.parseInt(new java.text.DecimalFormat("0").format(width * h/(height*1.0))); log.debug("change image's width, width:{}, height:{}.",w,h); } } } BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); Graphics g = bi.getGraphics(); g.drawImage(img, 0, 0, w, h, Color.LIGHT_GRAY, null); g.dispose();
public void cutImage(String srcImg, String destImg, int x, int y, int width, int height) { cutImage(new File(srcImg), destImg, new java.awt.Rectangle(x, y, width, height)); }
String p = imgFile.getPath(); // 将图片保存在原目录并加上前缀 ImageIO.write(bi, suffix, new File(p.substring(0,stIndexOf(File.separator)) + File.separator + prevfix +imgFile.getName())); log.debug("缩略图在原路径下生成成功"); } catch (IOException e) { log.error("generate thumbnail image failed.",e); } }else{ log.warn("the image is not exist."); } } public static void main(String[] args) { new ImageUtil().thumbnailImage("C:/Users/cm/Desktop/我的页 面/images/girlNoImg.jpg", 100, 150,DEFAULT_PREVFIX,DEFAULT_FORCE); } } 直接运行main方法,填入相对应的参数即可。 二、配合 js 生成裁剪图片 在我们修改个人微博、qq资料的时候可以上传个人头像,并可以剪裁个 人头像然后上传。剪裁图片的大小样式是通过JavaScript实现的,但是它 并不能生成一个新的图片。但是js剪裁图片提供图片的x,y坐标以及宽 高,通过这四个参数我们可以根据原图片生成新的剪裁图片。 步骤: 1、首先通过页面利用js实现图片剪切浏览功能,我参照慕课网提供的资 料并稍微更改了一下。另外我们也可以使用插件,比如Jcrop是款很不错 的图片裁剪插件。 下载地址:/detail/u012385190/9733480
java图片裁剪和java生成缩略图 一、缩略图 在浏览相册的时候,可能需要生成相应的缩略图。 直接上代码: public class ImageUtil { private Logger log = LoggerFactory.getLogger(getClass()); private static String DEFAULT_PREVFIX = "thumb_"; private static Boolean DEFAULT_FORCE = false;//建议该值为false /** * <p>Title: thumbnailImage</p> * <p>Description: 根据图片路径生成缩略图 </p> * @param imagePath 原图片路径 * @param w 缩略图宽 * @param h 缩略图高 * @param prevfix 生成缩略图的前缀 * @param force 是否强制按照宽高生成缩略图(如果为false,则生 成最佳比例缩略图) */ public void thumbnailImage(String imagePath, int w, int h, String prevfix, boolean force){ File imgFile = new File(imagePath); if(imgFile.exists()){ try { // ImageIO 支持的图片类型 : [BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG, JPEG, WBMP, GIF, gif] String types = Arrays.toString(ImageIO.getReaderFormatNames()); String suffix = null;
这里写图片描述 最后效果图如上,左侧可以拖动拖拉,右侧是预览图。 2、Java生成并保存剪切图片 public class ImageUtil2 { private Logger log = LoggerFactory.getLogger(getClass()); private static String DEFAULT_CUT_PREVFIX = "cut_"; /** * Description: 根据原图与裁切size截取局部图片 * @param srcImg 源图片 * @param output 图片输出流 * @param rect 需要截取部分的坐标和大小 */ public void cutImage(File srcImg, OutputStream output,java.awt.Rectangle rect) { if (srcImg.exists()) { java.io.FileInputStream fis = null; ImageInputStream iis = null; try { fis = new FileInputStream(srcImg); // ImageIO 支持的图片类型 : [BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG, // JPEG, WBMP, GIF, gif] String types = Arrays.toString(ImageIO.getReaderFormatNames()) .replace("]", ","); String suffix = null; // 获取图片后缀 if (srcImg.getName().indexOf(".") > -1) { suffix = srcImg.getName().substring(srcImg.getName().lastIndexOf(".") + 1); }// 类型和图片后缀全部小写,然后判断后缀是否合法