公司里要求上传的照片都要加上公司的logo,统一打在又下角。但是,由于照片有暗有亮,因此logo分成了2种,1种是在比较亮的情况下打的,1种是在比较暗的情况下打的。这可把我害惨了,如何判断明暗度嘛。奋力Google了1天终于理解,于是写出了实现代码。
由于注释写的比较全,因此不再进行解释,里面也有测试方法,可以进行下测试。
PS:目标图请做好备份,因为其会直接覆盖目标图
package image;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.PixelGrabber;
import java.io.File;
import java.io.FileOutputStream;
import javax.imageio.ImageIO;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
public class WaterMark {
/**
* 获取指定矩形中的像素的矩阵
*
* @param imageSrc
* @param startX
* @param startY
* @param w
* @param h
* @return
*/
private int[] getPixArray(Image imageSrc, int startX, int startY,
int w, int h) {
int[] pix = new int[(w - startX) * (h - startY)];
/*下面是别人程序中的一段,我实在不明白为何要加这一段,因为我去掉也没有问题,加上还会报错*/
PixelGrabber pg = null;
try {
pg = new PixelGrabber(imageSrc, startX, startY, w-startX, h-startY, pix, 0, w);
if (pg.grabPixels() != true) {
try {
throw new java.awt.AWTException("pg error" + pg.status());
} catch (Exception eq) {
eq.printStackTrace();
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return pix;
}
/**
* 将1张图片和另1张图片的指定区域重合。可用于制作水印。图片的左上角坐标为0,0
*
* @param lightnessWaterImg
* 颜色比较亮的水印图片,适合底色比较暗的情况
* @param darknessWaterImg
* 颜色比较暗的水印图片,适合底色比较亮的情况,如果不想区分,则输入null,平均灰度边界同时失效。
* @param targetImg
* 源图片
* @param startX
* @param startY
* @param x
* @param y
* @param alpha
* 透明度,0f为全透明,1f为完全不透明,0.5f为半透明
* @param averageGray
* 平均灰度边界(0-255),大于此值,则打暗的水印图片,小于此值则打亮的水印图片。
* 默认值128。超过范围,按默认值进行。
*/
private final void pressImage(String lightnessWaterImg,
String darknessWaterImg, String targetImg, int startX, int startY,
int x, int y, float alpha, float averageGray) {
try {
// 先判断亮水印和源文件的值是否为null,否则抛出异常
if (lightnessWaterImg == null || lightnessWaterImg == ""
|| targetImg == null || targetImg == "") {
throw new Exception("亮水印或者源图片的地址不能为空");
}
// 再判断平均灰度边界是否越界
if (averageGray>255||averageGray<0) {
averageGray = 128;
}
// 装载源图片
File _file = new File(targetImg);
// 图片装入内存
BufferedImage src = ImageIO.read(_file);
// 获取图片的尺寸
int width = src.getWidth(null);
int height = src.getHeight(null);
// 根据源图片尺寸,设置预装载的一个图片,默认是RGB格式的
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = image.createGraphics();
// 绘制内存中的源图片至指定的矩形内
graphics.drawImage(src, 0, 0, width, height, null);
// 在已经绘制的图片中加入透明度通道
graphics.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_ATOP, alpha));
// 获取源图片中和设定的同样大小的区域内的像素集合
int[] pixels = getPixArray(src, startX, startY, x, y);
//查询此集合的平均灰度
float average = getAverageGrap(x-startX,y-startY,pixels);
// 如果平均灰度大于130,则说明此区域比较亮,否则则比较暗
System.out.println(average);
//装载水印图片所需参数
File water;
BufferedImage bufferwater;
// 根据设定的平均灰度边界来装载不同的水印
if (darknessWaterImg == null||average>=averageGray) {
// 装载亮水印文件
water = new File(darknessWaterImg);
}else{
// 装载暗水印文件
water = new File(lightnessWaterImg);
}
// 装入内存
bufferwater = ImageIO.read(water);
graphics.drawImage(bufferwater, startX, startY, x, y,
null);
// 水印文件结束
graphics.dispose();
FileOutputStream out = new FileOutputStream(targetImg);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
// 绘制新的文件
encoder.encode(image);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 查询某个区域的平均灰度
* @param width
* @param height
* @param pixels
* @return
*/
private float getAverageGrap(int width,int height,int[] pixels){
/* 下面是开始算这个区域的亮度了,灰度等同于亮度 */
ColorModel colorModel = ColorModel.getRGBdefault();
int i = 0;
int j = 0;
int k = 0;
int r = 0;
int g = 0;
int b = 0;
int gray = 0;
float average = 0;// 平均灰度
for (i = 0; i < height; i++) {
for (j = 0; j < width; j++) {
// 定位像素点
k = i * width + j;
r = colorModel.getRed(pixels[k]);
g = colorModel.getGreen(pixels[k]);
b = colorModel.getBlue(pixels[k]);
// 计算灰度值
gray = (r * 38 + g * 75 + b * 15) >> 7;
average = average + gray;
}
}
// 计算平均灰度
average = average / ((i - 1) * (j - 1));
return average;
}
public static void main(String[] args) {
WaterMark waterMark = new WaterMark();
waterMark.pressImage("F:\\Mine\\My Pictures\\素材\\w2.png", "F:\\Mine\\My Pictures\\素材\\w1.png",
"F:\\Mine\\My Pictures\\素材\\2.jpg", 520, 500, 900, 800, 0.5f, 50);
System.out.print("添加成功");
}
}
分享到:
相关推荐
// 增加明暗度(这里假设增加50,可以根据需求调整) red += 50; green += 50; blue += 50; // 防止溢出,如果超过255,则设置为255 red = Math.min(255, red); green = Math.min(255, green); blue = Math...
webplugin调节屏幕明暗度软件 快捷键失效时好用的屏幕明暗度软件
在Android操作系统中,音量和明暗度是用户体验的重要组成部分,它们直接影响到用户与设备的交互方式和视觉舒适度。本文将深入探讨Android系统中的音量控制和屏幕明暗度调节,以及与手势操作的关联。 一、Android...
显示屏明暗度调节器,热键不好使的可以改换用这个
本文介绍了一种基于BH1750的机动车遮阳板明暗度智能控制系统的设计,旨在提高驾驶安全性,适应不同光线环境。该系统利用了LCD液晶屏的变光特性,通过实时监测外界光照强度,动态调整液晶屏的驱动电压,以改变遮阳板...
照片自动变清晰工具[8月27日修正明暗度问题]【值得收藏!】 照片自动变清晰工具[8月27日修正明暗度问题]【值得收藏!】 软件名称:照片自动变清晰工具┊轻轻松松把暗淡的图片瞬间变的清晰┊绿色版 软件类型:国产...
标题中的“基于BH1750的机动车遮阳板明暗度智能控制系统设计”涉及到一个汽车电子技术的应用,主要关注的是车内遮阳板的智能化控制。在这个系统中,BH1750是一款光强度传感器,用于检测环境光线的亮度,以此来调节...
一个由gltracy独立开发的轻量级体素编辑器,它的渲染效果也极为出色,自带的渲染工具,可以呈现不同的光线条件、光照度、明暗度和锐度。这使得全球不少体素爱好者都用它来创造自己的像素模型。操作简单,界面简洁。
**运算符与函数(Operators & Functions)**:Less支持数学运算,如加减乘除,以及内置函数,如`lighten()`、`darken()`用于调整颜色的亮度和暗度。比如,我们可以创建一个变量,表示公交车牌的背景色,并根据需要...
色彩是由红、绿、蓝(RGB)三种原色混合而成的,每种颜色都有其独特的饱和度和明暗度(亮度或纯度)。在网页设计中,色彩的选择应基于色彩心理学,不同的颜色能唤起不同的情感反应:红色代表热情与活力,蓝色则传递...
线性变化处理能改善由水印带来的对彩色图像明暗度的影响,同时利用一维Tent混沌的特性构成混沌二维置换网络,只需要一个初值,使算法更加简单。由实验结果表明该算法对JPEG压缩稳健,而对恶意操作敏感,同时水印提取...
色彩的明度变化是绘画艺术中一个至关重要的概念,它涉及到颜色的亮度或者暗度,是色彩三要素(色相、纯度、明度)之一。在本教学中,主要目标是让学生理解和感受色彩的明度变化,以及如何在实践中运用这种变化来创作...
同色调和是指使用同一颜色的不同深浅、色调和明暗度,可以营造出和谐统一的视觉效果。对比色则位于色环的相对位置,如红与绿、蓝与橙、黄与紫,它们相互补充,能够产生强烈的视觉冲击力,常用于突出关键元素或者增加...
音质识别训练则包括声音的明暗度、丰满度、染色判别、混响判断、噪声判断、左右平衡和前后平衡等。 使用How To Listen软件进行听音辨识训练的具体操作流程如下:用户首次使用时需要新建一个账户。之后,进入软件...
根据提供的信息,我们需要详细说明使用jQuery实现图片灯箱明暗遮罩效果的知识点。由于文件内容不完整,我们将基于文件标题和描述的内容,推断可能的知识点。 1. jQuery技术概述: jQuery是一个快速、小巧、功能丰富...
光的明暗度随着光源的能量和距离改变,摄影师要学会根据光线的强弱调整拍摄策略。 其次,光的方向对照片的立体感和影调起着决定性作用。主要的光位有顺光、侧光和逆光,它们分别呈现不同的视觉效果。顺光使物体明亮...
例如,Photoshop 软件可以对图像进行编辑、加工和处理,调整图像的颜色、对比度和明暗度等,使图像更加生动和吸引人。 3. Photoshop 在海报设计中的作用 Photoshop 软件在海报设计中可以发挥以下几个方面的作用: ...
SFS 方法还要基于三个假设:反射模型为朗伯特模型,即从各个角度观察,同一点的明暗度都相同的;光源为无限远处点光源;成像关系为正交投影。 光度立体视觉(Photometric Stereo) 光度立体视觉方法通过多个不共线的...
- **步骤一**:对于4100型号的打印机,进入“菜单”,选择“明暗度”,通过左右键调整,最后按下“确认”键。此操作适用于解决打印时放大后缩小不了的问题,或者使用一段时间后边缘缺失过多的情况。 - **步骤二**...