使用Java绘制图片边框,解决微信小程序map组件中marker与label层级关系问题,label增加外边框后显示不能置与marker上面

时间:2024-11-15 16:05:12
import javax.imageio.ImageIO; import java.awt.*; import java.awt.geom.RoundRectangle2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class ImageWithRoundedCorners { public static void main(String[] args) { try { // 加载原始图像 BufferedImage originalImage = ImageIO.read(new File("C:\\Users\\Admin\\Desktop\\feitu\\img100\\tmp_8abe0efd9e58dfd1608a6f9affd987ef-e67efe7a-3fd8-482f-8f5d-30e686491a73.jpg")); // 设置padding和圆角半径 int padding = 50; // 白色圆角区域的内边距(可以根据需求调整) int cornerRadius = 120; // 圆角的半径 // 将图像裁剪成正方形,设置宽高400*400 (注意:一定要固定宽高) BufferedImage squareImage = cropToSquare(originalImage, 400, 400); // 创建带padding的圆角图像 BufferedImage paddedRoundedImage = createPaddedRoundedImage(squareImage, cornerRadius, padding, Color.WHITE); // 保存结果图像 ImageIO.write(paddedRoundedImage, "PNG", new File("C:\\Users\\Admin\\Desktop\\feitu\\img100\\1tmp_8abe0efd9e58dfd1608a6f9affd987ef-e67efe7a-3fd8-482f-8f5d-30e686491a73.jpg")); } catch (IOException e) { e.printStackTrace(); } } //调用时候使用这个方法,把main注释掉 // public static BufferedImage startImageWithRounded(BufferedImage originalImage) { // // // 设置padding和圆角半径 // int padding = 50; // 白色圆角区域的内边距(可以根据需求调整) // int cornerRadius = 120; // 圆角的半径 // // // 将图像裁剪成正方形,设置宽高400*400 (注意:一定要固定宽高) // BufferedImage squareImage = cropToSquare(originalImage, 400, 400); // // // 创建带padding的圆角图像 // BufferedImage paddedRoundedImage = createPaddedRoundedImage(squareImage, cornerRadius, padding, Color.WHITE); // // return paddedRoundedImage; // // } public static BufferedImage cropToSquare(BufferedImage originalImage, int targetWidth, int targetHeight) { int width = originalImage.getWidth(); int height = originalImage.getHeight(); // 计算目标区域与图像的宽高比 double widthRatio = (double) targetWidth / width; double heightRatio = (double) targetHeight / height; // 选择较大的比例来保持图像的长宽比 double scaleRatio = Math.max(widthRatio, heightRatio); // 使用较大的比例 // 计算缩放后的图像尺寸 int newWidth = (int) (width * scaleRatio); int newHeight = (int) (height * scaleRatio); // 创建一个新的图像用于缩放 BufferedImage scaledImage = new BufferedImage(newWidth, newHeight, originalImage.getType()); Graphics2D g2d = scaledImage.createGraphics(); g2d.drawImage(originalImage, 0, 0, newWidth, newHeight, null); g2d.dispose(); // 创建目标图像(固定宽高) BufferedImage finalImage = new BufferedImage(targetWidth, targetHeight, originalImage.getType()); Graphics2D g2dFinal = finalImage.createGraphics(); // 计算裁剪区域的位置,居中显示 int xOffset = (newWidth - targetWidth) / 2; int yOffset = (newHeight - targetHeight) / 2; // 将缩放后的图像裁剪并绘制到目标图像上 g2dFinal.drawImage(scaledImage, -xOffset, -yOffset, null); g2dFinal.dispose(); return finalImage; } // 创建带padding和圆角的图像 public static BufferedImage createPaddedRoundedImage(BufferedImage originalImage, int cornerRadius, int padding, Color backgroundColor) { int originalWidth = originalImage.getWidth(); int originalHeight = originalImage.getHeight(); // 计算新图像的宽度和高度,包含padding int newWidth = Math.max(originalWidth, originalHeight) + 2 * padding; // 选择最大宽度或高度,确保裁剪时是正方形 int newHeight = newWidth; // 确保是正方形的裁剪区域 // 动态调整cornerRadius,确保不会超过图像的宽度或高度的一半 int maxCornerRadius = Math.min(originalWidth, originalHeight) / 2; cornerRadius = Math.min(cornerRadius, maxCornerRadius); // 防止圆角半径太大 // 创建一个新的BufferedImage来包含带有padding的图像 BufferedImage paddedRoundedImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB); // 获取Graphics2D对象 Graphics2D g2d = paddedRoundedImage.createGraphics(); // 启用抗锯齿渲染提示 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 启用抗锯齿 g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); // 设置高质量插值 g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); // 优化质量 // 填充背景颜色 g2d.setColor(backgroundColor); g2d.fillRoundRect(0, 0, newWidth, newHeight, cornerRadius, cornerRadius); // 绘制带圆角的背景 // 设置裁剪区域为圆角矩形,确保裁剪区域大小是填充后的正方形区域 g2d.setClip(new RoundRectangle2D.Double(padding, padding, originalWidth, originalHeight, cornerRadius, cornerRadius)); // 在新的图像上绘制原始图像(原图绘制到内边距后的区域) g2d.drawImage(originalImage, padding, padding, null); // 清理资源 g2d.dispose(); return paddedRoundedImage; } }