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:\\a2.png", "a1.png", "2.jpg", 520, 500, 900, 800, 0.5f, 50); system.out.print("添加成功"); }}
分享到:
相关推荐
java 处理图像的明暗度 java 处理图像的明暗度 java 处理图像的明暗度
webplugin调节屏幕明暗度软件 快捷键失效时好用的屏幕明暗度软件
Android音量明暗度
显示屏明暗度调节器,热键不好使的可以改换用这个
照片自动变清晰工具[8月27日修正明暗度问题]【值得收藏!】 照片自动变清晰工具[8月27日修正明暗度问题]【值得收藏!】 软件名称:照片自动变清晰工具┊轻轻松松把暗淡的图片瞬间变的清晰┊绿色版 软件类型:国产...
基于BH1750的机动车遮阳板明暗度智能控制系统设计.rar
基于BH1750的机动车遮阳板明暗度智能控制系统设计.pdf
线性变化处理能改善由水印带来的对彩色图像明暗度的影响,同时利用一维Tent混沌的特性构成混沌二维置换网络,只需要一个初值,使算法更加简单。由实验结果表明该算法对JPEG压缩稳健,而对恶意操作敏感,同时水印提取...
效果如下: DIV结构: jquery实现: 调用:
调光器RS232控制协议,控制明暗度,256级
所以只想调整图像色彩,而对于明暗度等其他要素不加改变的遥感影像可以使用这种方法。 三、可选颜色 在 Photoshop 中可选颜色也是一种调整图像色彩的有效方法。可选颜色是高档扫描仪和分色程序使用的一项技术,它...
MFC写的一个小的图像处理DEMO,可以快速对图像进行灰度处理、以及亮度处理, 处理过程均在线程中实现,比较快
主要介绍了Android程序开发之动态设置ImageView的亮度 的相关资料,需要的朋友可以参考下
图片透明和去色计算及加深减淡效果图片透明和去色计算及加深减淡效果的实现。学习图片计算的好例程。
单色方案:使用同一颜色的不同明暗度来创建和谐的颜色搭配。 互补色方案:使用色轮上相对位置的颜色来创建对比效果。 3. 字体选择 可读性:选择易于阅读的字体,如Roboto、Open Sans等。 字体大小:确保字体大小适中...
MSP430F149控制ADC7545输出,源程序代码,并能LED显示明暗度
亮度由其亮度表示。 图像的颜色信息存在于其色度中。 这种色度包括色相和饱和度。 此代码将所有这些亮度、色调和饱和度调整到正确的级别,从而校正亮度和颜色级别。
让模糊不清楚的照片变清晰,去噪点,细节增强的傻瓜式图形处理软件。...还可以修改焦点位置(景深),明暗度,色彩平衡等。 图像清晰设置工具—-单文件免安装版,只有281K,一键将图片变清晰!还可以手动修改一些细节。
在本教程中,我们还介绍了如何使用曲线来改变照片的局部色彩明暗度。通过对曲线的调整,可以使照片的局部色彩变得更加鲜艳和锐利。例如,如果想让照片的亮部呈现暖色,那么将蓝通道曲线向下拖动就可以了。 四、进阶...
YC-6800无线彩色触摸屏中控系统解决方案包括系统开关、各设备开关、灯光明暗度调节、信号切换、信号源的播 放和停止、各种组合模式的进入和切换、音量调节,以及对用于扩声的会议音响系统,讨论、表决、投票的数字...