`

根据明暗度分别加不同的水印

    博客分类:
  • Java
阅读更多

 

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("添加成功");
    }

}

 

1
0
分享到:
评论

相关推荐

    java 处理图像的明暗度

    // 增加明暗度(这里假设增加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系统中的音量控制和屏幕明暗度调节,以及与手势操作的关联。 一、Android...

    屏幕明暗度调节器2011版.exe

    显示屏明暗度调节器,热键不好使的可以改换用这个

    基于BH1750的机动车遮阳板明暗度智能控制系统设计.pdf

    这种基于BH1750的机动车遮阳板明暗度智能控制系统在实际应用中,能够自动根据环境光线条件调节遮阳板的明暗度,避免因光线过强或过弱影响驾驶员视线,从而有效提高驾驶舒适性和安全性。此外,这一技术也为未来机动车...

    照片自动变清晰工具[8月27日修正明暗度问题]【值得收藏!】

    照片自动变清晰工具[8月27日修正明暗度问题]【值得收藏!】 照片自动变清晰工具[8月27日修正明暗度问题]【值得收藏!】 软件名称:照片自动变清晰工具┊轻轻松松把暗淡的图片瞬间变的清晰┊绿色版 软件类型:国产...

    基于BH1750的机动车遮阳板明暗度智能控制系统设计.rar

    标题中的“基于BH1750的机动车遮阳板明暗度智能控制系统设计”涉及到一个汽车电子技术的应用,主要关注的是车内遮阳板的智能化控制。在这个系统中,BH1750是一款光强度传感器,用于检测环境光线的亮度,以此来调节...

    论文研究-基于小波变换的语音隐藏算法.pdf

    线性变化处理能改善由水印带来的对彩色图像明暗度的影响,同时利用一维Tent混沌的特性构成混沌二维置换网络,只需要一个初值,使算法更加简单。由实验结果表明该算法对JPEG压缩稳健,而对恶意操作敏感,同时水印提取...

    jquery实现图片灯箱明暗的遮罩效果

    根据提供的信息,我们需要详细说明使用jQuery实现图片灯箱明暗遮罩效果的知识点。由于文件内容不完整,我们将基于文件标题和描述的内容,推断可能的知识点。 1. jQuery技术概述: jQuery是一个快速、小巧、功能丰富...

    《摄影基础》拍摄光线概述.pptx

    光的明暗度随着光源的能量和距离改变,摄影师要学会根据光线的强弱调整拍摄策略。 其次,光的方向对照片的立体感和影调起着决定性作用。主要的光位有顺光、侧光和逆光,它们分别呈现不同的视觉效果。顺光使物体明亮...

    Photoshop在海报设计中的作用-计算机应用技术毕业论文.doc

    例如,Photoshop 软件可以对图像进行编辑、加工和处理,调整图像的颜色、对比度和明暗度等,使图像更加生动和吸引人。 3. Photoshop 在海报设计中的作用 Photoshop 软件在海报设计中可以发挥以下几个方面的作用: ...

    三星打印机加墨后清零方法

    - **步骤一**:对于4100型号的打印机,进入“菜单”,选择“明暗度”,通过左右键调整,最后按下“确认”键。此操作适用于解决打印时放大后缩小不了的问题,或者使用一段时间后边缘缺失过多的情况。 - **步骤二**...

    三维重建综述

    SFS 方法还要基于三个假设:反射模型为朗伯特模型,即从各个角度观察,同一点的明暗度都相同的;光源为无限远处点光源;成像关系为正交投影。 光度立体视觉(Photometric Stereo) 光度立体视觉方法通过多个不共线的...

    Android程序开发之动态设置ImageView的亮度

    在Android程序开发中,我们经常需要对UI元素进行各种自定义操作,以满足不同场景的需求。其中,调整ImageView的亮度是提升用户体验的一个重要方面。本文将深入探讨如何在Android中动态地设置ImageView的亮度。 首先...

    液晶显示器亮暗度调节软件下载

    预设模式如白天模式、夜晚模式或阅读模式等,为用户在不同场合下提供了便捷的亮度选择方案,使得用户能在多种环境下都能享受到最佳的显示效果。 更进一步,一些先进版本的亮度调节软件还集成了自动亮度调节功能。这...

    信息时代如何提高师生的信息素养.pdf

    此外,色彩的纯度和明暗度也能激发不同的情感联想,高纯度色彩显得华丽,低纯度则显得朴素。 【产品功能与色彩情感】在产品设计中,色彩被用来增强功能的表达和理解。如冰箱通常采用冷色调,暗示其制冷功能;闹钟的...

    VC图像的亮度处理

    其中,`brightness_value`是你想要增加或减少的亮度值,`new_pixel`和`old_pixel`分别是调整后和调整前的像素值。需要注意的是,如果新的像素值超过了255(对于8位图像),应将其截断到255,低于0则截断到0,以保持...

    ps中的颜色原理解读.docx

    亮度就是各种颜色的图形原色(如 RGB 图像的原色为 R、G、B 三种或各种自的色相)的明暗度,亮度调整也就是明暗度的调整。 亮度范围从 0 到 255,共分为 256 个等级。而我们通常讲的灰度图像,就是在纯白色和纯黑色...

    AUTO LEVEL:自动调整图像的亮度和颜色-matlab开发

    亮度是图像中像素的明暗程度,它决定了图像的整体明暗感觉。而颜色则由色度和饱和度两部分构成。色度是指颜色的位置,通常用色轮上的角度来表示,它代表了颜色的基本属性,如红色、蓝色或绿色。饱和度则是指颜色的...

Global site tag (gtag.js) - Google Analytics