Java裁剪压缩PNG图片,透明背景色变黑的解决方案
作者:新成同学
这篇文章主要介绍了Java裁剪压缩PNG图片,透明背景色变黑的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
Java裁剪压缩PNG图片,透明背景色变黑
import java.awt.Graphics2D; import java.awt.Image; import java.awt.Transparency; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; /** * 图片工具类 */ public class ImageUtil { /** * 裁剪PNG图片工具类 * * @param fromFile * 源文件 * @param toFile * 裁剪后的文件 * @param outputWidth * 裁剪宽度 * @param outputHeight * 裁剪高度 * @param proportion * 是否是等比缩放 */ public static void resizePng(File fromFile, File toFile, int outputWidth, int outputHeight, boolean proportion) { try { BufferedImage bi2 = ImageIO.read(fromFile); int newWidth; int newHeight; // 判断是否是等比缩放 if (proportion) { // 为等比缩放计算输出的图片宽度及高度 double rate1 = ((double) bi2.getWidth(null)) / (double) outputWidth + 0.1; double rate2 = ((double) bi2.getHeight(null)) / (double) outputHeight + 0.1; // 根据缩放比率大的进行缩放控制 double rate = rate1 < rate2 ? rate1 : rate2; newWidth = (int) (((double) bi2.getWidth(null)) / rate); newHeight = (int) (((double) bi2.getHeight(null)) / rate); } else { newWidth = outputWidth; // 输出的图片宽度 newHeight = outputHeight; // 输出的图片高度 } BufferedImage to = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = to.createGraphics(); to = g2d.getDeviceConfiguration().createCompatibleImage(newWidth, newHeight, Transparency.TRANSLUCENT); g2d.dispose(); g2d = to.createGraphics(); @SuppressWarnings("static-access") Image from = bi2.getScaledInstance(newWidth, newHeight, bi2.SCALE_AREA_AVERAGING); g2d.drawImage(from, 0, 0, null); g2d.dispose(); ImageIO.write(to, "png", toFile); } catch (Exception e) { e.printStackTrace(); } } /** * 测试 */ public static void main(String[] args) throws Exception { File fromFile = new File("c:/wxcking/pic/D77E37CB.png"); File toFile = new File("c:/wxcking/pic/D77E37CB_thumb.png"); resizePng(fromFile, toFile, 100, 100, false); } }
java ImageIO.write图片上传变色及背景变黑
public void getImage(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setDateHeader("Expires", 0); response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); response.addHeader("Cache-Control", "post-check=0, pre-check=0"); response.setHeader("Pragma", "no-cache"); response.setContentType("image/jpeg"); String uri = request.getRequestURI(); String imgPath = uri.replace("/ofc/rest/img", ""); File image = new File(imgPath); BufferedImage bi = ImageIO.read(image); BufferedImage newBi = resizeImagePng(bi.getWidth(), bi.getHeight(),bi); Graphics2D g2d = newBi.createGraphics(); g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 1.0f)); ServletOutputStream out = response.getOutputStream(); g2d.drawImage(newBi,0,0,null); ImageIO.write(newBi,"png", out); //ImageIO.write(bi, "jpg", out); //saveAs(bi,"jpg", out); }
public static BufferedImage resizeImagePng(int x, int y, BufferedImage bfi) { BufferedImage bufferedImage = new BufferedImage(x, y, BufferedImage.TYPE_INT_ARGB); bufferedImage.getGraphics().drawImage( bfi.getScaledInstance(x, y, Image.SCALE_SMOOTH), 0, 0, null); return bufferedImage; }
public static void saveAs(BufferedImage image, String formatName, ServletOutputStream outFile) throws IOException { if (formatName.equalsIgnoreCase("jpg") || formatName.equalsIgnoreCase("jpeg")) { BufferedImage tag = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_BGR); Graphics g = tag.getGraphics(); // Graphics2D gg=tag.createGraphics(); // tag = gg.getDeviceConfiguration().createCompatibleImage(image.getWidth(), image.getHeight(),Transparency.TRANSLUCENT); // gg.dispose(); // gg = tag.createGraphics(); // gg.drawImage(image, 0, 0,null); g.drawImage(image, 0, 0,image.getWidth(), image.getHeight(),image.getGraphics().getColor(), null); // 绘制缩小后的图 g.dispose(); image = tag; } ImageIO.write(image, formatName, outFile); }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。