import java.awt.AlphaComposite;

本文介绍了一个实用的Java图片处理工具类,包括图片压缩、添加文字和图片水印等功能。通过该工具类,开发者可以轻松地对图片进行压缩、添加文字或图片水印等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.awt.AlphaComposite;  
import java.awt.Color;  
import java.awt.Font;  
import java.awt.Graphics2D;  
import java.awt.Image;  
import java.awt.geom.AffineTransform;  
import java.awt.image.AffineTransformOp;  
import java.awt.image.BufferedImage;  
import java.io.File;  
import java.io.IOException;  
 
import javax.imageio.ImageIO;  
 
 
public final class ImageUtils {  
     
    public final static void pressImage(String pressImg, String targetImg, int x, int y, float alpha) {  
        try {  
            File img = new File(targetImg);  
            Image src = ImageIO.read(img);  
            int wideth = src.getWidth(null);  
            int height = src.getHeight(null);  
            BufferedImage image = new BufferedImage(wideth, height, BufferedImage.TYPE_INT_RGB);  
            Graphics2D g = image.createGraphics();  
            g.drawImage(src, 0, 0, wideth, height, null);  
            //水印文件  
            Image src_biao = ImageIO.read(new File(pressImg));  
            int wideth_biao = src_biao.getWidth(null);  
            int height_biao = src_biao.getHeight(null);  
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));  
            g.drawImage(src_biao, x, y, wideth_biao, height_biao, null);  
            //水印文件结束  
            g.dispose();  
            ImageIO.write((BufferedImage) image, "jpg", img);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
 
     
    public static void pressText(String pressText, String targetImg, String fontName, int fontStyle, Color color, int fontSize, int x, int y, float alpha) {  
        try {  
            File img = new File(targetImg);  
            Image src = ImageIO.read(img);  
            int width = src.getWidth(null);  
            int height = src.getHeight(null);  
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);  
            Graphics2D g = image.createGraphics();  
            g.drawImage(src, 0, 0, width, height, null);  
            g.setColor(color);  
            g.setFont(new Font(fontName, fontStyle, fontSize));  
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));  
            g.drawString(pressText, (width - (getLength(pressText) * fontSize)) / 2 + x, (height - fontSize) / 2 + y);  
            g.dispose();  
            ImageIO.write((BufferedImage) image, "jpg", img);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
 
     
    public static void resize(String filePath, int height, int width, boolean bb) {  
        try {  
            double ratio = 0.0; //缩放比例   
            File f = new File(filePath);  
            BufferedImage bi = ImageIO.read(f);  
            Image itemp = bi.getScaledInstance(width, height, bi.SCALE_SMOOTH);  
            //计算比例  
            if ((bi.getHeight() > height) || (bi.getWidth() > width)) {  
                if (bi.getHeight() > bi.getWidth()) {  
                    ratio = (new Integer(height)).doubleValue() / bi.getHeight();  
                } else {  
                    ratio = (new Integer(width)).doubleValue() / bi.getWidth();  
                }  
                AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(ratio, ratio), null);  
                itemp = op.filter(bi, null);  
            }  
            if (bb) {  
                BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);  
                Graphics2D g = image.createGraphics();  
                g.setColor(Color.white);  
                g.fillRect(0, 0, width, height);  
                if (width == itemp.getWidth(null))  
                    g.drawImage(itemp, 0, (height - itemp.getHeight(null)) / 2, itemp.getWidth(null), itemp.getHeight(null), Color.white, null);  
                else 
                    g.drawImage(itemp, (width - itemp.getWidth(null)) / 2, 0, itemp.getWidth(null), itemp.getHeight(null), Color.white, null);  
                g.dispose();  
                itemp = image;  
            }  
            ImageIO.write((BufferedImage) itemp, "jpg", f);  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
 
    public static void main(String[] args) throws IOException {  
        pressImage("G://imgtest//sy.jpg", "G://imgtest//test1.jpg", 0, 0, 0.5f);  
        pressText("我是文字水印", "G://imgtest//test1.jpg", "黑体", 36, Color.white, 80, 0, 0, 0.3f);  
        resize("G://imgtest//test1.jpg", 500, 500, true);  
    }  
 
    public static int getLength(String text) {  
        int length = 0;  
        for (int i = 0; i < text.length(); i++) {  
            if (new String(text.charAt(i) + "").getBytes().length > 1) {  
                length += 2;  
            } else {  
                length += 1;  
            }  
        }  
        return length / 2;  
    }  

Develop an image converter viewer application, to perform the following. The input image must be converted into (a) grayscale image, (b) negative image, (c) red image, (d) green image, (e) blue image, (f) Sepia image, (g) mirror image and (d) image with watermark with words “@UPC 2025”. Display resulting images one after another with 5-seconds of delay between each. Here is an example is provided, where the program converts an image (Test1.jpg) to grayscale (Test2.png) and negative (Test3.png) versions, then displays them one after another with a 5-second delay between each. import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import java.awt.FlowLayout; public class ImageConverterViewer { public static void main(String args[]) throws IOException, InterruptedException { // Load the original image BufferedImage originalImg = null; File f = null; try { f = new File("C:/Images/Test1.jpg"); originalImg = ImageIO.read(f); } catch (IOException e) { System.out.println(e); return; } // Create grayscale image BufferedImage grayImg = createGrayscaleImage(originalImg); saveImage(grayImg, "C:/Images/Test2.png", "Grayscale conversion complete."); // Create negative image BufferedImage negativeImg = createNegativeImage(originalImg); saveImage(negativeImg, "C:/Images/Test3.png", "Negative conversion complete."); // Display images one after another displayImagesWithDelay(originalImg, grayImg, negativeImg); } private static BufferedImage createGrayscaleImage(BufferedImage img) { int width = img.getWidth(); int height = img.getHeight(); BufferedImage grayImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
最新发布
07-19
这段代码中能解决重复添加水印的问题吗?每次添加水印之前先清空水印 import com.engine.doc.util.WaterMarkUtil; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.awt.image.ImageObserver; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import java.util.UUID; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import weaver.file.util.FileDeleteUtil; import weaver.general.BaseBean; import weaver.general.GCONST; import weaver.general.Util; import weaver.hrm.User; public class ImageMarkTwoUtil { public ImageMarkTwoUtil() { } public static void createMark(String var0, String var1, String var2, Color var3, float var4, String var5, int var6, int var7, Color var8) { String var9 = var1.contains(".") ? var1.substring(var1.lastIndexOf(".")) : ".JPG"; createMarkForPic2(var0, var1, var2, var3, var4, var5, var6, var7, var8, var9); } public static void createMarkForPic1(String var0, String var1, String var2, Color var3, float var4, String var5, int var6, int var7, Color var8) { String var9 = var1.contains(".") ? var1.substring(var1.lastIndexOf(".")) : ".JPG"; createMarkForPic2(var0, var1, var2, var3, var4, var5, var6, var7, var8, var9); } public static void createMarkForPic2(String var0, String var1, String var2, Color var3, float var4, String var5, int var6, int var7, Color var8, String var9) { createMarkForPic2(var0, var1, var2, var3, var4, var5, var6, var7, var8, var9, (Map)null); } public static void createMarkForPic2(String var0, String var1, String var2, Color var3, float var4, String var5, int var6, int var7, Color var8, String var9, Map<String, Object> var10) { // 强制覆盖参数以满足需求 var6 = 12; // 固定为12pt(Word 5号字) int repeatTimes = 3; // 固定绘制3次 int startX = 30; // 左上角X起始位置 int startY = 30; // 左上角Y起始位置 int stepY = 40; // 每次绘制的垂直间距 // 修复点:在方法开始处声明并初始化为null FileOutputStream var11 = null; try { // 原代码读取图片逻辑 BufferedImage var22 = ImageIO.read(new File(var0)); int var23 = var22.getWidth(null); int var24 = var22.getHeight(null); BufferedImage var25 = new BufferedImage(var23, var24, BufferedImage.TYPE_INT_RGB); Graphics2D var26 = var25.createGraphics(); var26.drawImage(var22, 0, 0, var23, var24, null); // 设置字体(强制12pt加粗) var26.setFont(new Font(var5, Font.BOLD, var6)); FontMetrics var34 = var26.getFontMetrics(); // 设置抗锯齿 var26.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 设置透明度(保留原参数var4) var26.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, var4)); // 修改后的绘制逻辑(3次绘制+白字黑边) for (int i = 0; i < repeatTimes; i++) { int currentY = startY + (i * stepY); // 绘制黑色描边 var26.setColor(Color.BLACK); var26.drawString(var2, startX-1, currentY-1); var26.drawString(var2, startX+1, currentY-1); var26.drawString(var2, startX-1, currentY+1); var26.drawString(var2, startX+1, currentY+1); // 绘制白色文字 var26.setColor(Color.WHITE); var26.drawString(var2, startX, currentY); } var26.dispose(); // 输出文件 var11 = new FileOutputStream(var1); // 在此处初始化 String var50 = "JPG"; if (var9.indexOf(".") != -1) { var50 = var9.substring(var9.lastIndexOf(".") + 1); } ImageIO.write(var25, var50, var11); } catch (Exception var47) { var47.printStackTrace(); } finally { try { if (null != var11) { var11.close(); } } catch (Exception var46) { var46.printStackTrace(); } } } public static File startMark(InputStream var0, String var1, String var2) { try { BaseBean var3 = new BaseBean(); String var4 = Util.null2String(var3.getPropValue("PdfWaterMarkSet", "htmlwaterFont")); try { var4 = new String(var4.getBytes("ISO-8859-1"), "UTF-8"); } catch (Exception var15) { var4 = "Microsoft YaHei"; } String var5 = Util.null2String(var3.getPropValue("PdfWaterMarkSet", "htmlwaterColor")); try { var5 = new String(var5.getBytes("ISO-8859-1"), "UTF-8"); } catch (Exception var14) { var5 = "222,222,222"; } int var6 = 222; int var7 = 222; int var8 = 222; if (!"".equals(var5) && var5.indexOf(",") > 0) { String[] var9 = var5.split(","); if (var9 != null && var9.length >= 3) { var6 = Util.getIntValue(var9[0]); var7 = Util.getIntValue(var9[1]); var8 = Util.getIntValue(var9[2]); } } String var17 = getTargetFilePath(var2); File var10 = new File(var17); inputstreamtofile(var0, var10); String var11 = getTargetFilePath(var2); createMark(var17, var11, var1, (Color)null, 1.0F, var4, 25, 0, new Color(var6, var7, var8)); File var12 = new File(var17); (new FileDeleteUtil()).deleteFile(var12); (new FileDeleteUtil()).deleteFile(var10); File var13 = new File(var11); if (var13.exists()) { var0.close(); return var13; } } catch (Exception var16) { var16.printStackTrace(); } return null; } public static File addSystemImgwmForPic(InputStream var0, String var1, String var2, User var3) { BufferedImage var4 = null; try { HashMap var5 = new HashMap(); var5.put("isconvert", "1"); var5.put("document", "document"); Map var6 = WaterMarkUtil.getWmSetting(var5, var3); Map var7 = (Map)var6.get("wmSetting"); String var8 = Util.null2String(var7.get("opacity")); String var9 = Util.null2String(var7.get("rotate")); String var10 = Util.null2String(var7.get("wmwidth")); String var11 = Util.null2String(var7.get("wmheight")); int var12 = Util.getIntValue(var8); int var13 = Util.getIntValue(var9); int var14 = Util.getIntValue(var10); int var15 = Util.getIntValue(var11); String var16 = getTargetFilePath(var2); File var17 = new File(var16); inputstreamtofile(var0, var17); String var18 = getTargetFilePath(var2); var4 = ImageIO.read(var17); int var19 = var4.getWidth((ImageObserver)null); int var20 = var4.getHeight((ImageObserver)null); BufferedImage var21 = new BufferedImage(var19, var20, 1); Graphics2D var22 = var21.createGraphics(); var22.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); var22.drawImage(var4.getScaledInstance(var19, var20, 4), 0, 0, (ImageObserver)null); ImageIcon var23 = new ImageIcon(var1); Image var24 = var23.getImage(); var22.rotate(Math.toRadians((double)(-var13)), (double)var21.getWidth() / 2.0D, (double)var21.getHeight() / 2.0D); float var25 = (float)var12 / 100.0F; var22.setComposite(AlphaComposite.getInstance(10, var25)); int var26 = var20 / var15; int var27 = var19 / var14; for(int var28 = 0; var28 < var26 + 1; ++var28) { for(int var29 = 0; var29 < var27 + 1; ++var29) { var22.drawImage(var24, var14 * (var29 + 1) - var14 / 2, var15 * (var28 + 1) - var15 / 2, (ImageObserver)null); } } var22.setComposite(AlphaComposite.getInstance(3)); var22.dispose(); File var32 = new File(var18); ImageIO.write(var21, "jpg", var32); File var33 = new File(var16); (new FileDeleteUtil()).deleteFile(var33); (new FileDeleteUtil()).deleteFile(var17); File var30 = new File(var18); if (var30.exists()) { var0.close(); return var30; } } catch (IOException var31) { var31.printStackTrace(); } return null; } public static File addSystemWaterForPic(InputStream var0, String var1, String var2, User var3) { HashMap var4 = new HashMap(); var4.put("isconvert", "1"); var4.put("document", "document"); Map var5 = WaterMarkUtil.getWmSetting(var4, var3); Map var6 = (Map)var5.get("wmSetting"); String var7 = Util.null2String(var5.get("familyname")); String var8 = Util.null2String(var6.get("fontsize")); String var9 = Util.null2String(var6.get("color")); int var10 = Util.getIntValue(var8); try { new BaseBean(); String var12 = var7; try { new String(var12.getBytes("ISO-8859-1"), "UTF-8"); } catch (Exception var23) { var12 = "Microsoft YaHei"; } String var13 = WaterMarkUtil.stringtoRGB(var9); try { var13 = new String(var13.getBytes("ISO-8859-1"), "UTF-8"); } catch (Exception var22) { var13 = "222,222,222"; } int var14 = 128; int var15 = 128; int var16 = 128; if (!var13.isEmpty() && var13.indexOf(",") > 0) { String[] var17 = var13.split(","); if (var17 != null && var17.length >= 3) { var14 = Util.getIntValue(var17[0]); var15 = Util.getIntValue(var17[1]); var16 = Util.getIntValue(var17[2]); } } String var25 = getTargetFilePath(var2); File var18 = new File(var25); inputstreamtofile(var0, var18); String var19 = getTargetFilePath(var2); createMarkForPic2(var25, var19, var1, (Color)null, 1.0F, var7, var10, 10, new Color(var14, var15, var16), var2, var6); File var20 = new File(var25); (new FileDeleteUtil()).deleteFile(var20); (new FileDeleteUtil()).deleteFile(var18); File var21 = new File(var19); if (var21.exists()) { var0.close(); return var21; } } catch (Exception var24) { var24.printStackTrace(); } return null; } public static File startMarkForPic(InputStream var0, String var1, String var2) { try { BaseBean var3 = new BaseBean(); String var4 = Util.null2String(var3.getPropValue("PdfWaterMarkSet", "htmlwaterFont")); try { var4 = new String(var4.getBytes("ISO-8859-1"), "UTF-8"); } catch (Exception var15) { var4 = "Microsoft YaHei"; } String var5 = Util.null2String(var3.getPropValue("PdfWaterMarkSet", "htmlwaterColor")); try { var5 = new String(var5.getBytes("ISO-8859-1"), "UTF-8"); } catch (Exception var14) { var5 = "222,222,222"; } int var6 = 222; int var7 = 222; int var8 = 222; if (!"".equals(var5) && var5.indexOf(",") > 0) { String[] var9 = var5.split(","); if (var9 != null && var9.length >= 3) { var6 = Util.getIntValue(var9[0]); var7 = Util.getIntValue(var9[1]); var8 = Util.getIntValue(var9[2]); } } String var17 = getTargetFilePath(var2); File var10 = new File(var17); inputstreamtofile(var0, var10); String var11 = getTargetFilePath(var2); createMarkForPic2(var17, var11, var1, (Color)null, 1.0F, var4, 15, 10, new Color(var6, var7, var8), var2); File var12 = new File(var17); (new FileDeleteUtil()).deleteFile(var12); (new FileDeleteUtil()).deleteFile(var10); File var13 = new File(var11); if (var13.exists()) { var0.close(); return var13; } } catch (Exception var16) { var16.printStackTrace(); } return null; } private static String getTargetFilePath(String var0) { String var1 = GCONST.getRootPath() + "filesystem" + File.separatorChar + "docWaterMarkTemp"; File var2 = new File(var1); if (!var2.exists() && !var2.isDirectory()) { var2.mkdirs(); } UUID var3 = UUID.randomUUID(); var1 = var1 + File.separatorChar + var3.toString() + var0; return var1; } private static void inputstreamtofile(InputStream var0, File var1) { try { FileOutputStream var2 = new FileOutputStream(var1); boolean var3 = false; byte[] var4 = new byte[8192]; int var6; while((var6 = var0.read(var4, 0, 8192)) != -1) { var2.write(var4, 0, var6); } var2.close(); var0.close(); } catch (Exception var5) { var5.printStackTrace(); } } public static void drawString(Graphics2D var0, String var1, float var2, float var3, int var4, float var5, float var6, boolean var7, boolean var8) { if (var1 != null && var1.length() != 0) { if (var7) { var1 = var1.replaceAll("\\n+", "\n").trim(); } if (var8) { var1 = "  " + var1.replaceAll("\\n", "\n  "); } drawString(var0, var1, var2, var3, var4, var5, var6); } } public static void drawString(Graphics2D var0, String var1, float var2, float var3, int var4, float var5, float var6) { if (var1 != null && var1.length() != 0) { FontMetrics var7 = var0.getFontMetrics(); StringBuilder var8 = new StringBuilder(); for(int var9 = 0; var9 < var1.length(); ++var9) { char var10 = var1.charAt(var9); var8.append(var10); int var11 = var7.stringWidth(var8.toString()); if (var10 == '\n' || (float)var11 > var3) { if (var10 == '\n') { ++var9; } if (var4 > 1) { var0.drawString(var1.substring(0, var9), var5, var6); drawString(var0, var1.substring(var9), var2, var3, var4 - 1, var5, var6 + var2); } else { var0.drawString(var1.substring(0, var9 - 1) + "…", var5, var6); } return; } } var0.drawString(var1, var5, var6); } } public static ByteArrayOutputStream getOutputStream(InputStream var0) throws IOException { ByteArrayOutputStream var1 = new ByteArrayOutputStream(); try { byte[] var2 = new byte[1024]; int var3; while((var3 = var0.read(var2)) > -1) { var1.write(var2, 0, var3); } var1.flush(); } catch (Exception var4) { } return var1; } }
07-12
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值