微信小程序有涉及到 图片上传的地方,需要对上传的图片进行压缩,开始考虑在微信小程序端直接处理。通过查询资料,可以使用wx.canvasToTempFilePath实现,但是尝试了一下感觉效果不是很好,最后考虑在后台进行压缩再保存。https://blog.csdn.net/forever_ss/article/details/51568057这篇文章中提供的方法可行,但是测试后发现压缩后的图片有白色的多余背景,并且压缩时没有根据原图片的长宽进行等比压缩,稍微修改就有了一下的代码,分享给大家。 import com.sun.imageio.plugins.jpeg.JPEGImageWriter; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageTypeSpecifier; import javax.imageio.metadata.IIOMetadata; import javax.imageio.plugins.jpeg.JPEGImageWriteParam; import javax.imageio.stream.ImageOutputStream; import org.w3c.dom.Element; public class ImagesTool { public static void img_change(String url, String name) { Tosmallerpic(url, new File(url + name), "", name, (float) 0.7); } /** * @param f 图片所在的文件夹路径 * @param file 图片路径 * @param ext 扩展名(拓展名为空则覆盖原图片,否则生成新的图片) * @param n 图片名 * @param per 百分比 */ private static void Tosmallerpic(String f, File file, String ext, String n, float per) { Image src; try { src = javax.imageio.ImageIO.read(file); String img_midname = f + n.substring(0, n.indexOf(".")) + ext + n.substring(n.indexOf(".")); int width; int height; // 为等比缩放计算输出的图片宽度及高度 double rate1 = ((double) src.getWidth(null)) / (double) 940 + 0.1; double rate2 = ((double) src.getHeight(null)) / (double) 1160 + 0.1; // 根据缩放比率大的进行缩放控制 double rate = rate1 > rate2 ? rate1 : rate2; width = (int) (((double) src.getWidth(null)) / rate); height = (int) (((double) src.getHeight(null)) / rate); BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); bufferedImage.getGraphics().drawImage( src.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null); FileOutputStream fos = new FileOutputStream(img_midname); //输出到文件流 saveAsJPEG(100, bufferedImage, per, fos); fos.close(); } catch (IOException ex) { } } /** * 以JPEG编码保存图片 * * @param dpi 分辨率 * @param image_to_save 要处理的图像图片 * @param JPEGcompression 压缩比 * @param fos 文件输出流 * @throws IOException */ public static void saveAsJPEG(Integer dpi, BufferedImage image_to_save, float JPEGcompression, FileOutputStream fos) throws IOException { JPEGImageWriter imageWriter = (JPEGImageWriter) ImageIO.getImageWritersBySuffix("jpg").next(); ImageOutputStream ios = ImageIO.createImageOutputStream(fos); imageWriter.setOutput(ios); IIOMetadata imageMetaData = imageWriter.getDefaultImageMetadata(new ImageTypeSpecifier(image_to_save), null); if (dpi != null && !dpi.equals("")) { Element tree = (Element) imageMetaData.getAsTree("javax_imageio_jpeg_image_1.0"); Element jfif = (Element) tree.getElementsByTagName("app0JFIF").item(0); jfif.setAttribute("Xdensity", Integer.toString(dpi)); jfif.setAttribute("Ydensity", Integer.toString(dpi)); } if (JPEGcompression >= 0 && JPEGcompression <= 1f) { JPEGImageWriteParam jpegParams = (JPEGImageWriteParam) imageWriter.getDefaultWriteParam(); jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT); jpegParams.setCompressionQuality(JPEGcompression); } imageWriter.write(imageMetaData, new IIOImage(image_to_save, null, null), null); ios.close(); imageWriter.dispose(); } } 调用方法如下: ImagesTool.img_change("F://uploadImages","/1.jpg");
图片上传等比压缩(java)
猜你喜欢
转载自blog.csdn.net/Stephen0726/article/details/81741046
今日推荐
周排行