package file; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.WritableRaster; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import net.coobird.thumbnailator.Thumbnails; public class ImageUtil { /** * 左上方添加图片 * @param bgImagePath * @param fgImagePath * @param overlayImagePath */ public static String overlayLeftTop(String bgImagePath, String fgImagePath, String overlayImagePath) { return overlay(bgImagePath, fgImagePath, overlayImagePath, 0, 0); } /** * 右上方添加图片 * @param bgImagePath * @param fgImagePath * @param overlayImagePath */ public static String overlayRightTop(String bgImagePath, String fgImagePath, String overlayImagePath) { return overlay(bgImagePath, fgImagePath, overlayImagePath, 1, 0); } /** * 左下方添加图片 * @param bgImagePath * @param fgImagePath * @param overlayImagePath */ public static String overlayLeftButtom(String bgImagePath, String fgImagePath, String overlayImagePath) { return overlay(bgImagePath, fgImagePath, overlayImagePath, 0, 1); } /** * 右下方添加图片 * @param bgImagePath * @param fgImagePath * @param overlayImagePath */ public static String overlayRightButtom(String bgImagePath, String fgImagePath, String overlayImagePath) { return overlay(bgImagePath, fgImagePath, overlayImagePath, 1, 1); } /** * 合成图片 x:前置图片所在x轴位置 y:前置图片所在y轴位置 */ public static String overlay(String bgImagePath, String fgImagePath, String overlayImagePath, int x, int y) { if (!strIsValid(bgImagePath) || !strIsValid(fgImagePath) || !strIsValid(overlayImagePath)) { throw new IllegalArgumentException(); } BufferedImage bgImage = readImage(bgImagePath); BufferedImage fgImage = readImage(fgImagePath); // 合成图片 BufferedImage overlayedImage = overlayImages(bgImage, fgImage, x, y); /** 输出图片 */ if (overlayedImage != null) { File file = new File(overlayImagePath); if (file.exists()) file.delete(); writeImage(overlayedImage, overlayImagePath, "PNG"); } return overlayImagePath; } /** * 合成图片 * * @param bgImage * @param fgImage * @return */ public static BufferedImage overlayImages(BufferedImage bgImage, BufferedImage fgImage, int x, int y) { if (fgImage.getHeight() > bgImage.getHeight() || fgImage.getWidth() > fgImage.getWidth()) { return null; } Graphics2D g = bgImage.createGraphics(); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.drawImage(bgImage, 0, 0, null); g.drawImage(fgImage, x, y, null); g.dispose(); return bgImage; } /** * 读取图片 * * @param fileLocation * @return */ public static BufferedImage readImage(String fileLocation) { BufferedImage img = null; try { img = ImageIO.read(new File(fileLocation)); } catch (IOException e) { e.printStackTrace(); } return img; } /** * 输出图片 * * @param img * @param fileLocation * @param extension */ public static void writeImage(BufferedImage img, String fileLocation, String extension) { try { BufferedImage bi = img; File outputfile = new File(fileLocation); ImageIO.write(bi, extension, outputfile); } catch (IOException e) { e.printStackTrace(); } } /** * 检查图片的高度和宽度 * * @param imagePath * @param height * @param width * @return */ public static boolean checkImageHW(String imagePath, int height, int width) { if (StrUtil.isNullOrEmpty(imagePath)) return false; try { BufferedImage image = ImageIO.read(new File(imagePath)); int w = image.getWidth(); int h = image.getHeight(); return w == width && h == height; } catch (IOException e) { return false; } } /** * 图片等比例缩小 * * @param fromFileStr * : 原图片路径 * @param saveToFileStr * : 缩小后图片的路径 * @param width * : 图片缩小后的高度 * @param height * : 图片缩小后的宽度 * @throws Exception */ public static void shrinkImage(String fromFileStr, String saveToFileStr, int width, int height) { if (!strIsValid(fromFileStr) || !strIsValid(fromFileStr)) { throw new IllegalArgumentException("image path is null"); } try { Thumbnails.of(fromFileStr).size(width,height).toFile(saveToFileStr); } catch (IOException e) { throw new RuntimeException(e); } } /** * 图片缩小 * @param source * @param targetW * @param targetH * @param equalProportion 是否等比缩小 * @return */ public static BufferedImage resize(BufferedImage source, int targetW, int targetH, boolean equalProportion) { int type = source.getType(); BufferedImage target = null; double sx = (double) targetW / source.getWidth(); double sy = (double) targetH / source.getHeight(); if (equalProportion) { if (sx > sy) { sx = sy; targetW = (int) (sx * source.getWidth()); } else { sy = sx; targetH = (int) (sx * source.getHeight()); } } if (type == BufferedImage.TYPE_CUSTOM) { ColorModel cm = source.getColorModel(); WritableRaster raster = cm.createCompatibleWritableRaster(targetW, targetH); boolean alphaPremultiplied = cm.isAlphaPremultiplied(); target = new BufferedImage(cm, raster, alphaPremultiplied, null); } else { target = new BufferedImage(targetW, targetH, type); Graphics2D g = target.createGraphics(); g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy)); g.dispose(); } return target; } public static boolean strIsValid(String str) { return str != null && !str.trim().equals(""); } }
相关推荐
Photomatix用来处理同一场景下不同曝光设置的照片。这些照片称为包围曝光照片,许多型号的相机都有自动包围曝光功能。 但并非一定需要多张照片才能使用Photomatix。色调映射工具(Tone Mapping tool)也能用于48位...
gimp是什么软件:gimp中文版是一款完全免费且开源的跨平台专业图像处理软件,提供一流的色彩管理功能,以确保在数字和印刷媒体上实现高保真色彩再现,gimp中文版支持多种图像处理工具、全通道、多级撤销操作恢复旧貌...
软件名称: 图片格式批量换理狗 Image Batch Dog ... 软件采用高级优秀算法,在对原有图片数据最大程度保真的同时,具有特别快速的处理速度; 软件体积小巧,是一款绿色软件,免安装; 操作简单:
office图片处理工具,处理后的图片高度保真,使用方便!
软件采用高级优秀算法,在对原有图片数据最大程度保真的同时,具有特别快速的处理速度; 软件体积小巧,是一款绿色软件,免安装; 操作简单: 回车键,开始/暂停操作; ESC键 ,停止操作。
批量转换:方便转换大批量图片(支持子文件夹下所有图片)的格式,并自动高保真压缩大小; 批量添加相框:方便为大批量图片添加相同的相框/大头贴/毛边; 批量文字:由用户自定义格式化文字,加入到选择图片及文件夹...
的图片导入、图片智能按比例处理(确保不变形,不损害象素,高保真,加动感模式、字幕、音乐、相框、模板处理,视频输出达到1920*1080超清晰视频,图片字幕、片头制作、文字相框得心应手。相框风格涉及流金岁月、...
高保真转换:精确还原文档元素,包括文本、图片、表格和格式。 安全保障:本地转换过程,确保文档安全和隐私。 简单易用:直观的用户界面,轻松上手,无需复杂设置。 适用场景: 学术研究:轻松整理和编辑研究资料...
图像和视频信号数字化可以避免远距离传输的累积失真,数字化存储可以高保真还原,并且容易借助计算机进行灵活处理和管理。而传输和存储图像需要占用大量的数据空间,这严重影响了传输速率和实时处理量,极大地制约了...
在这项工作中,我们解决了在Facebook上设计隐私保护,高保真,存储高效的照片共享解决方案的问题。 我们首先对Facebook对上传的图片执行的操作进行深入研究。 了解了这些信息后,我们建议采用一种DCT域图像加密方案...
但是,生成高保真杂波返回涉及许多步骤,因此计算成本通常很高。例如,使用以下步骤模拟杂波 将整个地形划分为杂乱的小块。图块的大小取决于方位角图片跨度和范围分辨率。 对于每个补丁,计算其相应的参数,例如...
面向初学者的OpenCV-Python教程教程地址:本仓库为教程中所用到的源码、图片和音视频素材等目录入门篇标题简介了解和安装OpenCV-Python度量运行时间/提升效率的几种方式图片的载入/显示和保存高保真保存图片、...
2. **高保真度**:尽可能准确地呈现 HTML 元素的样式和布局。 3. **跨浏览器支持**:在大多数主流浏览器上工作。 4. **可配置性**:允许自定义一些参数,如图像质量、尺寸等。 5. **元素选择**:可以选择要转换的...
用户只需要通过拖拽、缩放和旋转等简单操作即可完成自我形象设计,设计完成作品轻松保存为相片,并且分级按多种倍数以及局部特写等方式保存,高画质高保真,给你完全真实的体验。在电脑配置允许的情况下可以输出无限...
4、图像高保真,无失真和变形:可以通过下面我们的演示页面,看出我们的全景图像的变形程度,绝无变形和扭曲。 5、提供源代码,是目前国内唯一提供源代码的360度全景展示系统,解除客户后顾之忧。 6、提供全景制作...
原型(高保真) 解密 设计 名字 为什么“现在我们翻转” ? 描述 标识 描述 参考图片: Anaconda MAA最终徽标: 颜色 描述 版式 描述 图片 描述 特征 功能一 描述 未来实施的功能 在不久的将来绝对需要。描述 ...
参赛选手依据给定的功能描述,使用Photoshop图像工具软件处理和设计图片,使用Adobe XD进行高保真原型设计,需符合移动应用UI设计规范,同时实现原型界面之间交互的功能。 2.模块B:移动应用前端开发 参赛选手按照...
采用“32位高保真内核技术”,图像色彩不失真,更加逼真。 输出图像清晰亮丽,层次分明。 4. 图像浏览,别具特色 提供对“鼠标浏览操作”的全方位支持,鼠标滚轮、鼠标右键,具有特殊功用。 提供对“键盘浏览...
高保真音乐的音质 3. 常见音乐格式 任务四 多媒体视频的使用 1. 电视视频的制式 2. 视频分辨率 3. 刷新率 4. 常见视频格式 ----------------------- 《计算机应用基础》教材目录全文共3页,当前为第1页。 《计算机...
Gerbolyze高保真SVG / PNG / JPG到PCB转换器Gerbolyze将SVG矢量和PNG / JPG光栅图像渲染到现有的Gerber PCB制造文件中。 无需中间光栅化/重新矢量化步骤,即可无损呈现SVG文件中的矢量数据。 尽管如此,gerbolyze...