上代码:
/** * 按照比例缩放 * * @param sourceFile * @param targetFile */ public void zoom(File sourceFile, File targetFile, int wh,int yh,boolean circular) { try { BufferedImage image = ImageIO.read(sourceFile); BufferedImage newImage = zoom(image, (int) Math.ceil(wh ), (int) Math.ceil(yh)); //去除背景黑底 newImage.getGraphics().fillRect( 0, 0 , wh, yh); newImage.getGraphics().drawImage(image.getScaledInstance(wh, yh,Image.SCALE_SMOOTH), 0, 0, null); String formatName = getImageFormatName(sourceFile); if (formatName == null || formatName.length() == 0) { return; } //设置图片变成圆形 if(circular){ newImage=convertCircular(newImage,wh); } ImageIO.write(newImage, formatName, targetFile); } catch (IOException e) { e.printStackTrace(); } }
/** * 传入的图像必须是正方形的 才会 圆形 如果是长方形的比例则会变成椭圆的 * * 图片裁圆 * @return * @throws IOException */ public static BufferedImage convertCircular(BufferedImage bi1,int min) throws IOException { //BufferedImage bi1 = ImageIO.read(sourceFile); // 这种是黑色底的 //BufferedImage bi2 = new BufferedImage(bi1.getWidth(), bi1.getHeight(), BufferedImage.TYPE_INT_RGB); // 透明底的图片 BufferedImage bi2 = new BufferedImage(min, min, BufferedImage.TYPE_4BYTE_ABGR); Ellipse2D.Double shape = new Ellipse2D.Double(0, 0,min,min); Graphics2D g2 = bi2.createGraphics(); g2.setClip(shape); // 使用 setRenderingHint 设置抗锯齿 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.drawImage(bi1, 0, 0, null); // 设置颜色 g2.setBackground(Color.green); g2.dispose(); return bi2; }
newImage.getGraphics().fillRect( 0, 0 , wh, yh);
newImage.getGraphics().drawImage(image.getScaledInstance(wh, yh,Image.SCALE_SMOOTH), 0, 0, null);
这两行代码是为了背景去黑底起作用的