import java.awt.AlphaComposite; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.RenderingHints; import java.awt.Toolkit; import java.awt.image.BufferedImage; import java.awt.image.CropImageFilter; import java.awt.image.FilteredImageSource; import java.awt.image.ImageFilter; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import javax.imageio.ImageIO; import javax.swing.ImageIcon; /** * 批量生成图片,图片宽度>=500加水印 * * @author Administrator * */ public class ImageUtil { private static Integer noSupport = 0; private static Integer support = 0; private static Integer iconCount = 0; /** * 生成缩略图,和水印图片 * L 大 M 中 S 小 */ public static void createThumbByWidthnailAndWatermark(String ftpPath, String originalImage) { Integer sSize = 320; Integer mSeze = 720; Integer lSize = 1080; File file = new File(originalImage); String imageName = file.getName(); String spath = "320/"+ftpPath;//.replace("img", "S/img"); String mpath = "720/"+ftpPath;//.replace("img", "M/img"); String lpath = "1080/"+ftpPath;//.replace("img", "L/img"); int width = getImgWidth(originalImage,file); int hight = getImgHight(originalImage,file); if (width < 1080) { lSize = width; } if (width < 720) { mSeze = width; } if (width < 320) { sSize = width; } if (width <= 0) { width = 0; } try { if (width >= 500) { createThumbByWidth(originalImage,imageName, lpath, lSize, (int) (hight * (((float) lSize / (float) width)))); markImageByIcon(originalImage,imageName, lpath, lSize / 2 - 100, (int) (hight * (((float) lSize / (float) width))) / 2, lpath, 0); iconCount++; } else { createThumbByWidth(originalImage,imageName, lpath, lSize, (int) (hight * (((float) lSize / (float) width)))); } createThumbByWidth(originalImage,imageName, mpath, mSeze, (int) (hight * (((float) mSeze / (float) width)))); createThumbByWidth(originalImage,imageName, spath, sSize, (int) (hight * (((float) sSize / (float) width)))); } catch (IOException e) { e.printStackTrace(); } } public static boolean delAllFile(String path) { boolean flag = false; File file = new File(path); if (!file.exists()) { return flag; } if (!file.isDirectory()) { return flag; } String[] tempList = file.list(); File temp = null; for (int i = 0; i < tempList.length; i++) { if (path.endsWith(File.separator)) { temp = new File(path + tempList[i]); } else { temp = new File(path + File.separator + tempList[i]); } if (temp.isFile()) { temp.delete(); } if (temp.isDirectory()) { delAllFile(path + "/" + tempList[i]);// 先删除文件夹里面的文件 delFolder(path + "/" + tempList[i]);// 再删除空文件夹 flag = true; } } return flag; } // 删除文件夹 // param folderPath 文件夹完整绝对路径 public static void delFolder(String folderPath) { try { delAllFile(folderPath); // 删除完里面所有内容 String filePath = folderPath; filePath = filePath.toString(); java.io.File myFilePath = new java.io.File(filePath); myFilePath.delete(); // 删除空文件夹 } catch (Exception e) { e.printStackTrace(); } } /** * 新建文件 */ public static void createFile(String path) { File sFile = new File(path.replace("img", "S/img")); File mFile = new File(path.replace("img", "M/img")); File lFile = new File(path.replace("img", "L/img")); File tempFile = new File(path.replace("img", "temp/img")); // 创建文件夹 if (!sFile.exists()) { sFile.mkdirs(); } if (!mFile.exists()) { mFile.mkdirs(); } if (!lFile.exists()) { lFile.mkdirs(); } if (!tempFile.exists()) { tempFile.mkdirs(); } } /** * 获取图片宽度 * * @param file * 图片文件 * @return 高度 */ public static int getImgWidth(String path,File file) { InputStream is = null; BufferedImage src = null; int ret = -1; try { URL url = new URL(path); is = url.openConnection().getInputStream(); src = ImageIO.read(is); ret = src.getWidth(null); // 得到源图高 is.close(); support++; } catch (Exception e) { noSupport++; // copyFile(file, new File(file.getPath().replace("img", "L/img"))); // copyFile(file, new File(file.getPath().replace("img", "S/img"))); // copyFile(file, new File(file.getPath().replace("img", "M/img"))); System.out.println(file.getPath() + "不支持压缩"); } return ret; } // 复制文件 public static void copyFile(File sourceFile, File targetFile) throws IOException { BufferedInputStream inBuff = null; BufferedOutputStream outBuff = null; try { // 新建文件输入流并对它进行缓冲 inBuff = new BufferedInputStream(new FileInputStream(sourceFile)); // 新建文件输出流并对它进行缓冲 outBuff = new BufferedOutputStream(new FileOutputStream(targetFile)); // 缓冲数组 byte[] b = new byte[1024 * 5]; int len; while ((len = inBuff.read(b)) != -1) { outBuff.write(b, 0, len); } // 刷新此缓冲的输出流 outBuff.flush(); } finally { // 关闭流 if (inBuff != null) inBuff.close(); if (outBuff != null) outBuff.close(); } } /** * 获取图片高度 * * @param file * 图片文件 * @return 高度 */ public static int getImgHight(String path,File file) { InputStream is = null; BufferedImage src = null; int ret = -1; try { URL url = new URL(path); is = url.openConnection().getInputStream(); src = ImageIO.read(is); ret = src.getHeight(null); // 得到源图高 is.close(); } catch (Exception e) { System.out.println(file.getPath() + "不支持压缩"); } return ret; } /** * 取后缀名 * @param fileName * @return */ public static String getExtention(String fileName) { int pos = fileName.lastIndexOf("."); return fileName.substring(pos + 1); } /** * 给图片添加水印、可设置水印图片旋转角度 * @param iconPath 水印图片路径 * @param srcImgPath 源图片路径 * @param targerPath 目标图片路径 * @param degree 水印图片旋转角度 */ public static void markImageByIcon(String originalImage,String fileName, String srcImgPath,Integer x, Integer y, String targerPath, Integer degree) { try { URL url = new URL(originalImage); InputStream oldIs = url.openConnection().getInputStream(); Image srcImg = ImageIO.read(oldIs); BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null), srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB); // 得到画笔对象 Graphics2D g = buffImg.createGraphics(); // 设置对线段的锯齿状边缘处理 g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg .getHeight(null), Image.SCALE_SMOOTH), 0, 0, null); if (null != degree) { // 设置水印旋转 g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg .getHeight() / 2); } // 水印图象的路径 水印一般为gif或者png的,这样可设置透明度 ImageIcon imgIcon = new ImageIcon(Constants.IMAGE_ICON_PATH); // 得到Image对象。 Image img = imgIcon.getImage(); float alpha = 1f; // 透明度 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); // 表示水印图片的位置 g.drawImage(img,x,y,null); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); g.dispose(); ByteArrayOutputStream os = new ByteArrayOutputStream(); // 生成图片 ImageIO.write(buffImg, "JPG", os); InputStream is = new ByteArrayInputStream(os.toByteArray()); FtpUtil.uploadFile(Constants.FTP_URL, Constants.FTP_PORT, Constants.FTP_USERNAME, Constants.FTP_PASSWORD, srcImgPath, fileName, is); } catch (Exception e) { e.printStackTrace(); } } /** * 按比例缩放图片 * @param srcImgPath 原图片地址 * @param destImgPath 目标图片地址 * @param destImgW 目标宽度 * @param destImgH 目标高度 * @throws IOException */ public static void createThumbByWidth (String srcImgPath ,String fileName, String destImgPath, int destImgW , int destImgH) throws IOException{ //原图片等比例缩小或放大之后的图片 int narrowImgW ; int narrowImgH ; //原图片大小 int srcImgW ; int srcImgH ; URL url = new URL(srcImgPath); InputStream oldIs = url.openConnection().getInputStream(); BufferedImage bi = ImageIO.read(oldIs); srcImgW = bi.getWidth(); srcImgH = bi.getHeight(); narrowImgW = destImgW; narrowImgH = ( int) (((float )destImgW / (float)srcImgW)*srcImgH); int cutNarrowImgSize = (narrowImgH - destImgH)/2; BufferedImage narrowImg = new BufferedImage(narrowImgW, narrowImgH,BufferedImage.TYPE_INT_RGB); narrowImg.getGraphics().drawImage(bi.getScaledInstance(narrowImgW, narrowImgH, Image.SCALE_SMOOTH ), 0, 0, null); Image image = narrowImg.getScaledInstance(narrowImgW, narrowImgH, Image.SCALE_DEFAULT ); CropImageFilter cropFilter = new CropImageFilter(0, cutNarrowImgSize, narrowImgW, narrowImgH-cutNarrowImgSize); Image img = Toolkit.getDefaultToolkit().createImage( new FilteredImageSource(image.getSource(), cropFilter)); BufferedImage cutTopNarrowImg = new BufferedImage( narrowImgW, narrowImgH-cutNarrowImgSize,BufferedImage. TYPE_INT_RGB); cutTopNarrowImg.getGraphics().drawImage(img, 0, 0, null); image = cutTopNarrowImg.getScaledInstance(narrowImgW, narrowImgH-cutNarrowImgSize, Image. SCALE_DEFAULT); cropFilter = new CropImageFilter(0, 0, narrowImgW, narrowImgH-cutNarrowImgSize*2); img = Toolkit.getDefaultToolkit().createImage( new FilteredImageSource(image.getSource(), cropFilter)); BufferedImage cutBottomNarrowImg = new BufferedImage( narrowImgW, narrowImgH-cutNarrowImgSize*2,BufferedImage. TYPE_INT_RGB); Graphics g = cutBottomNarrowImg.getGraphics(); g.drawImage(img, 0, 0, null); g.dispose(); ByteArrayOutputStream os = new ByteArrayOutputStream(); // 生成图片 ImageIO.write(cutBottomNarrowImg, "JPEG", os); InputStream is = new ByteArrayInputStream(os.toByteArray()); FtpUtil.uploadFile(Constants.FTP_URL, Constants.FTP_PORT, Constants.FTP_USERNAME, Constants.FTP_PASSWORD, destImgPath, fileName, is); } /** * 裁剪图片 * @param srcImageFile 源图像地址 * @param x 目标切片起点x坐标 * @param y 目标切片起点y坐标 * @param destWidth 目标切片宽度 * @param destHeight 目标切片高度 */ public static void abscut(String srcImageFile, int x, int y, int destWidth, int destHeight) { try { Image img; ImageFilter cropFilter; // 读取源图像 BufferedImage bi = ImageIO.read(new File(srcImageFile)); int srcWidth = bi.getWidth(); // 源图宽度 int srcHeight = bi.getHeight(); // 源图高度 if (srcWidth >= destWidth && srcHeight >= destHeight) { Image image = bi.getScaledInstance(srcWidth, srcHeight, Image.SCALE_DEFAULT); /* **************************************** * 判断原图的宽高和DIV宽高的大小 * 若srcWidth>DIV宽,则【w=destWidth*srcWidth/420】 * 若srcWidth<DIV宽,则【w=destWidth】 * 若srcHeight>DIV高,则【h=destHeight*srcHeight/420】 * 若srcHeight<DIV高,则【h=destHeight】 *************************************** */ int x1 = x*srcWidth/420; int y1 = y*srcWidth/420; int w = destWidth*srcWidth/420; int h = destHeight*srcWidth/420; System.out.println("srcWidth= " + srcWidth + "\tsrcHeight= " + srcHeight); System.out.println("w= " + w + "\t h= " + h); System.out.println("x1= " + x1 + "\t y1= " + y1); System.out.println("x= " + x + "\t y= " + y); System.out.println("destWidth= " + destWidth + "\t destHeight= " + destHeight); System.out.println("srcWidth/420= " + srcWidth/420 + "\t srcHeight/420= " + srcHeight/420); // 改进的想法:是否可用多线程加快切割速度 // 四个参数分别为图像起点坐标和宽高 // 即: CropImageFilter(int x,int y,int width,int height) cropFilter = new CropImageFilter(x1, y1, w, h); img = Toolkit.getDefaultToolkit().createImage( new FilteredImageSource(image.getSource(), cropFilter)); BufferedImage tag = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); Graphics g = tag.getGraphics(); g.drawImage(img, 0, 0, null); // 绘制缩小后的图 g.dispose(); // 输出为文件 ImageIO.write(tag, "JPEG", new File(srcImageFile)); } } catch (Exception e) { e.printStackTrace(); } } /** * 按比例缩放图片 * @param srcImgPath 原图片地址 * @param destImgPath 目标图片地址 * @param destImgW 目标宽度 * @param destImgH 目标高度 * @throws IOException */ public static void createThumb(String srcImgPath , String destImgPath, int destImgW , int destImgH) throws IOException{ //原图片等比例缩小或放大之后的图片 int narrowImgW ; int narrowImgH ; //原图片大小 int srcImgW ; int srcImgH ; BufferedImage bi = ImageIO. read(new File(srcImgPath)); srcImgW = bi.getWidth(); srcImgH = bi.getHeight(); // 转换图片尺寸与目标尺寸比较 , 如果转换图片较小,说明转换图片相对于目标图片来说高较小,需要以高为基准进行缩放。 if((float )srcImgW /srcImgH > (float)destImgW / destImgH){ narrowImgW = ( int)(((float )destImgH / (float)srcImgH)*srcImgW); narrowImgH = destImgH; //按照原图以高为基准等比例缩放、或放大。这一步高为所需图片的高度,宽度肯定会比目标宽度宽。 int cutNarrowImgSize = (narrowImgW - destImgW)/2; BufferedImage narrowImg = new BufferedImage(narrowImgW, narrowImgH,BufferedImage.TYPE_INT_RGB); narrowImg.getGraphics().drawImage(bi.getScaledInstance(narrowImgW, narrowImgH, Image.SCALE_SMOOTH ), 0, 0, null); //等比例缩放完成后宽度与目标尺寸宽度相比较 , 将多余宽的部分分为两份 ,左边删除一部分 Image image = narrowImg.getScaledInstance(narrowImgW, narrowImgH, Image.SCALE_DEFAULT ); CropImageFilter cropFilter = new CropImageFilter(cutNarrowImgSize, 0, narrowImgW-cutNarrowImgSize, narrowImgH); Image img = Toolkit.getDefaultToolkit().createImage( new FilteredImageSource(image.getSource(), cropFilter)); BufferedImage cutLiftNarrowImg = new BufferedImage( narrowImgW-cutNarrowImgSize, narrowImgH,BufferedImage.TYPE_INT_RGB ); cutLiftNarrowImg.getGraphics().drawImage(img, 0, 0, null); //右边删除一部分 image = cutLiftNarrowImg.getScaledInstance(narrowImgW-cutNarrowImgSize, narrowImgH, Image.SCALE_DEFAULT ); cropFilter = new CropImageFilter(0, 0, narrowImgW-cutNarrowImgSize*2, narrowImgH); img = Toolkit.getDefaultToolkit().createImage( new FilteredImageSource(image.getSource(), cropFilter)); BufferedImage cutRightNarrowImg = new BufferedImage( narrowImgW-cutNarrowImgSize*2, narrowImgH,BufferedImage.TYPE_INT_RGB ); Graphics g = cutRightNarrowImg.getGraphics(); g.drawImage(img, 0, 0, null); // 绘制截取后的图 g.dispose(); //输出为文件 最终为所需要的格式 ImageIO. write(cutRightNarrowImg, "JPEG", new File(destImgPath)); } else{ //以宽度为基准 narrowImgW = destImgW; narrowImgH = ( int) (((float )destImgW / (float)srcImgW)*srcImgH); int cutNarrowImgSize = (narrowImgH - destImgH)/2; BufferedImage narrowImg = new BufferedImage(narrowImgW, narrowImgH,BufferedImage.TYPE_INT_RGB); narrowImg.getGraphics().drawImage(bi.getScaledInstance(narrowImgW, narrowImgH, Image.SCALE_SMOOTH ), 0, 0, null); Image image = narrowImg.getScaledInstance(narrowImgW, narrowImgH, Image.SCALE_DEFAULT ); CropImageFilter cropFilter = new CropImageFilter(0, cutNarrowImgSize, narrowImgW, narrowImgH-cutNarrowImgSize); Image img = Toolkit.getDefaultToolkit().createImage( new FilteredImageSource(image.getSource(), cropFilter)); BufferedImage cutTopNarrowImg = new BufferedImage( narrowImgW, narrowImgH-cutNarrowImgSize,BufferedImage. TYPE_INT_RGB); cutTopNarrowImg.getGraphics().drawImage(img, 0, 0, null); image = cutTopNarrowImg.getScaledInstance(narrowImgW, narrowImgH-cutNarrowImgSize, Image. SCALE_DEFAULT); cropFilter = new CropImageFilter(0, 0, narrowImgW, narrowImgH-cutNarrowImgSize*2); img = Toolkit.getDefaultToolkit().createImage( new FilteredImageSource(image.getSource(), cropFilter)); BufferedImage cutBottomNarrowImg = new BufferedImage( narrowImgW, narrowImgH-cutNarrowImgSize*2,BufferedImage. TYPE_INT_RGB); Graphics g = cutBottomNarrowImg.getGraphics(); g.drawImage(img, 0, 0, null); g.dispose(); ImageIO.write(cutBottomNarrowImg, "JPEG", new File(destImgPath)); } } }
相关推荐
在频域中操作可以更方便地进行滤波、压缩和添加水印等操作。 Java是编程语言,这里用来编写实现DFT和水印功能的代码。Java具有跨平台的特性,使得开发的程序可以在不同的操作系统上运行。 OpenCV是一个开源的...
在Java编程环境中,图片压缩和加水印是两个常见的图像处理任务。这些功能在很多应用场景中都很重要,比如网站图片上传、社交媒体分享、数字资产管理等。下面将详细讲解这两个知识点,以及如何使用Java来实现。 首先...
在这个项目中,IDEA作为开发平台,帮助开发者组织和运行源代码,进行调试和测试,以确保水印添加功能的正确性和性能。 文件名称"ImgWatermark"很可能是指项目中的核心类或模块,负责处理图像水印的主要逻辑。这个类...
System.out.println("水印添加成功,新图片已保存至:" + targetImagePath); } catch (ImageReadException | IOException | ImageWriteException e) { e.printStackTrace(); } } private static ...
thumbnailator(包括jar包跟api) java用于图片压缩 生成缩略图 添加水印等 这是我见过最好的压缩工具了 使用方法: Thumbnails.of(new File("path/to/directory").listFiles()) .size(640, 480) .outputFormat(...
在IT行业中,图片处理是一项常见的任务,特别是在网页设计、移动应用和社交媒体等领域。"图片压缩和水印源码工具"提供了实现这一目标的代码...在进行图片压缩和水印添加时,理解底层原理并灵活运用工具是非常重要的。
在Java编程领域,图片处理是一项常见的任务,而添加水印是增强版权保护或者美化图片的常见操作。这个压缩包文件包含的源码是用于在图片上添加图片水印和文字水印的功能,同时允许调整水印的透明度和偏移度。让我们...
在IT行业中,处理图像数据是一项常见的任务,而生成二维码、添加图片水印以及图片压缩是其中的三个关键操作。这些技术广泛应用于品牌推广、数据存储、网页设计等多个领域。接下来,我们将深入探讨这三个知识点。 ...
"Thumbnails 纯java图片压缩api 包括文档及相关学习资料" 是一个专为Java开发者设计的图片压缩库,旨在提供高效的图片压缩解决方案。下面将详细介绍这个API的核心特性、使用方法以及为何它能在Java图片处理领域...
Java盲水印BlindWatermark具有多项关键特性,首先,它的抗干扰性强,即便图像遭受一定程度的破坏,如质量下降、压缩处理,甚至旋转,水印依然可以被提取出来,保证了信息的完整性。其次,其安全性突出,采用的独特...
- 保护图片版权,可以添加水印或元数据信息。 这个项目的核心是通过Java实现图片的压缩和缩放功能,结合批量处理能力,能够有效地服务于各种Java Web应用中的图片管理需求。开发者可以根据实际场景,灵活调整处理...
在压缩包中的"java图片大小转换"文件中,很可能包含了实现这些功能的示例代码和使用说明,可以参考学习以加深理解。在实际开发中,我们还可以借助第三方库如`ImageMagick`、`Java Advanced Imaging (JAI)`或`JavaFX`...
总结,Android图片压缩和加水印是提高应用性能和保护版权的重要手段。开发者可以根据项目需求选择合适的方法,结合Android SDK和第三方库来实现高效、美观的功能。在AddWatermark-master这个项目中,你可能找到更...
在本案例中,我们将探讨如何使用Struts1.3实现图片上传并添加水印以及进行图片压缩的功能。 首先,前端JSP页面负责用户交互。表单`<form>`使用`enctype="multipart/form-data"`属性来处理文件上传,`input type=...
阿里巴巴泄露门使用的傅里叶...添加数字盲水印的方法简单可分为空域方法和频域方法,这两种方法添加了冗余信息,但在编码和压缩情况不变的情况下,不会使原始图像大小产生变化(原来是10MB添加盲水印之后还是10MB)。
综上所述,通过结合JSP、Java后端处理和jQuery Uploadify插件,我们可以创建一个功能完善的图片水印系统,既满足了图片上传的需求,又实现了高效、美观的水印添加。在实际应用中,还可以考虑进一步优化,比如增加...
1. **图片压缩**:将图片压缩至指定尺寸,保持原始宽高比。 ```java import net.coobird.thumbnailator.Thumbnails; import net.coobird.thumbnailator.builders.ThumbnailParameterBuilder; import ...
【标题】:“基于jsp实现图片网页视频加水印”这一项目是软件工程课程的一个实践作业,旨在通过Java Web技术实现在网页、图片以及视频上添加水印的功能。这个任务不仅涵盖了基本的编程技能,还涉及到了软件开发的全...
- `ImageOperate.java水印.txt`可能包含水印添加的代码实现。 通过理解这些基本概念和使用相关的Java类库,开发者可以构建强大的图像处理工具,满足各种需求,包括社交媒体分享、在线编辑器、数据可视化以及艺术...
"图片处理"则涵盖了更广泛的技术,包括图像的编辑、增强、分析和压缩等,而LSB水印嵌入属于这一领域的隐私和安全部分。 在压缩包文件名称"ZLJImageProcess"中,"ZLJ"可能是作者或项目名称的缩写,"ImageProcess...