Java实现在图片中嵌入字符串

问题描述

Java实现在图片中嵌入字符串

我想在图片中嵌入字符串,以下程序实现了在图片中嵌入图片,请问要怎样改???

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;

public class Watermark extends JFrame implements ActionListener
{

Image iImage, oImage;
BufferedImage bImage;

int   iw, ih;
int[] pixels,//像素
      cphpix;             //加密图像数组 

boolean loadflag = false,
        runflag  = false; //图像处理执行标志 

String imn,               //图像文件名
       imh,               //加密图像标识"c_"
   wtr,
   title;             //图像标题               

ImageWatermark watermark;
RAW reader;
Common common;

public Watermark()
{
    setTitle("LSB图像水印");
    this.setBackground(Color.lightGray);        

    //菜单界面
    setMenu();

    watermark = new ImageWatermark();
    reader = new RAW();
    common = new Common();

    //关闭窗口
    closeWin();

    setSize(530, 330);
    setVisible(true);
}

public void actionPerformed(ActionEvent evt)
{
    Graphics graph = getGraphics();
    MediaTracker tracker = new MediaTracker(this); 

    if (evt.getSource() == openItem)
    {
        //打开要加水印的图片
        JFileChooser chooser = new JFileChooser();
        common.chooseFile(chooser, "./images/ch15", 0);
        int r = chooser.showOpenDialog(null);     

        if(r == JFileChooser.APPROVE_OPTION)
        {
            if(runflag)
            {
                loadflag = false;
                runflag  = false;
            }             

            if(!loadflag)
{
    String name = chooser.getSelectedFile().getAbsolutePath(); 

            //取文件名
            String filename = chooser.getSelectedFile().getName(); 

            int len = filename.length();

            //取扩展名
            String exname = filename.substring(len-3, len);

            //取文件名imn
            imn = filename.substring(0, len-4);

            //取加密标识imh
            imh = filename.substring(0, 2);

                if(exname.equalsIgnoreCase("raw"))
            {
                pixels = reader.readRAW1D(name, iw, ih);
                ImageProducer ip = new MemoryImageSource(iw, ih,
                                                         pixels, 0, iw);
            iImage = createImage(ip);
            }
            else
                {
            //装载图像
iImage = common.openImage(name, tracker);
//取载入图像的宽和高
iw = iImage.getWidth(null);
ih = iImage.getHeight(null);
repaint();
}
if(!imh.equals("j_")) title = "原图";
else                  title = "受攻击";
loadflag = true;
}
        }
    }

//LSB图像水印嵌入
else if(evt.getSource() == wlsbimageItem)
{
if(loadflag)
{
setTitle(" LSB图像水印 ");

//选择水印路径
JOptionPane.showMessageDialog(null, "请选择要嵌入的水印!");
JFileChooser iconfileChooser = new JFileChooser("F:");
int returnVal2 = iconfileChooser.showOpenDialog(iconfileChooser);//打开"打开文件"对话框
String waterpath = iconfileChooser.getSelectedFile().getAbsolutePath();//你选择的文件夹的路径

pixels = common.grabber(common.openImage( waterpath, tracker), iw, ih);

//读入水印图像
int[] water = watermark.readWater(pixels, iw, ih);

pixels = common.grabber(iImage, iw, ih);
System.out.println("水印"+pixels);

//嵌入水印
pixels = watermark.chaosEmbed(pixels, water, iw, ih);
showPix(graph, pixels, iw, ih, "原图", "含水印图");

runflag = true;

    //写入.raw含水印文件

reader.writeRAW("./images/ch15/water/w_" + imn +
".raw", pixels, iw, ih);

            JOptionPane.showMessageDialog(null, "在目录images/ch15/water,
"
                                    + "保存含水印图像w_" + imn+".raw成功!");
}
else
    JOptionPane.showMessageDialog(null,"请先打开一幅图!");

}
//LSB图像水印提取
else if(evt.getSource() == dlsbimageItem)
{

//选择要提取水印图片的路径
JOptionPane.showMessageDialog(null, "请选择要提取水印的图片!");
JFileChooser iconfileChooser = new JFileChooser("./images/ch15/water");
int returnVal2 = iconfileChooser.showOpenDialog(iconfileChooser);//打开"打开文件"对话框
String picwaterpath = iconfileChooser.getSelectedFile().getAbsolutePath();//你选择的文件夹的路径
pixels = reader.readRAW1D(picwaterpath, iw, ih);
ImageProducer ip = new MemoryImageSource(iw, ih, pixels, 0, iw);
oImage = createImage(ip);

pixels = common.grabber(oImage, iw, ih);

//提取水印图像
pixels = watermark.getWater(pixels, iw, ih);
showPix(graph, pixels, iw, ih, "原图", "取出水印");
runflag  = true;

}

    else if (evt.getSource() == exitItem)
        System.exit(0);
}

public void paint(Graphics g)
{
    if (iImage != null)
    {
        g.clearRect(0, 0, 530, 350);
        g.drawImage(iImage, 5, 50, null);
        g.drawString(title, 120, 320);
    }
}

public Image showPix(Graphics graph, int[] pixels, int w, int h,
                     String istr, String ostr)
{

//将数组中的象素产生一个图像
ImageProducer ip = new MemoryImageSource(w, h, pixels, 0, w);
Image oImage = createImage(ip);
common.draw(graph, iImage, istr, oImage, ostr);
runflag = true;
return oImage;
}

public static void main(String[] args)
{
    new Watermark();
} 

private void closeWin()
{
    addWindowListener(new WindowAdapter()
    {
        public void windowClosing(WindowEvent e)
        {
            System.exit(0);
        }
    });
}

//菜单界面
public void setMenu()
{
    Menu fileMenu = new Menu("文件");
    openItem = new MenuItem("打开");
    openItem.addActionListener(this);
    fileMenu.add(openItem);

    exitItem = new MenuItem("退出");
    exitItem.addActionListener(this);
    fileMenu.add(exitItem);       

    Menu spwaterMenu = new Menu("空域水印");

    wlsbimageItem = new MenuItem("LSB图像水印嵌入");
    wlsbimageItem.addActionListener(this);
    spwaterMenu.add(wlsbimageItem);

    dlsbimageItem = new MenuItem("LSB图像水印提取");
    dlsbimageItem.addActionListener(this);
    spwaterMenu.add(dlsbimageItem);      

    MenuBar menuBar = new MenuBar();
    menuBar.add(fileMenu);
    menuBar.add(spwaterMenu);
    setMenuBar(menuBar);
}

MenuItem openItem;
MenuItem exitItem;

MenuItem wlsbimageItem;   //lsb嵌入图像水印
MenuItem dlsbimageItem;   //lsb检测图像水印

}

import java.awt.Image;
import java.io.*;

public class ImageWatermark {

Common common = new Common();

// LSB嵌入水印
public int[] chaosEmbed(int[] pix, int[] water, int iw, int ih) {
for (int i = 0; i < iw * ih; i++) {
int emb;// 含水印灰度
int gray;// 灰度值

// 取(i,j)处的灰度
gray = pix[i] & 0xFF;

if (gray % 2 == 1)
gray = gray - 1;// 最低位清零

emb = gray + water[i];// 最低位嵌入水印

pix[i] = 255 << 24 | emb << 16 << 8 | emb;
}
return pix;
}

// 读入水印图,并转为二值图像矩阵
public int[] readWater(int[] pix, int iw, int ih) {
int gray;// 灰度值

for (int i = 0; i < iw * ih; i++) {
gray = pix[i] & 0xFF;// 取(i,j)处的灰度
if (gray > 128)
pix[i] = 0;// while
else
pix[i] = 1;// black
}
return pix;
}

//提取水印图像
public int[] getWater(int[] pix, int iw, int ih) {
int g;
for (int i = 0; i < iw * ih; i++) {
g = pix[i] & 0xFF;
if (g % 2 == 0)
g = 255;
else
g = 0;
pix[i] = 255 << 24 | g << 16 | g << 8 | g;
}
return pix;
}

// 读入32*32水印图,并转为二值图像矩阵
public int[] readImWater(int[] pix, int iw, int ih) {
int gray;// 灰度值
for (int i = 0; i < iw * ih; i++) {
gray = pix[i] & 0xFF;// 取[i,j]处的灰度
if (gray > 128)
pix[i] = 255;// white
else
pix[i] = 0;// black
}
return pix;
}

}

解决方案

字符串的相似度 (java实现)

解决方案二:

登录验证码生成就是采用的这种方式图片中嵌字符串的。

解决方案三:

参考:http://blog.csdn.net/caoyuan10036/article/details/7278735

时间: 2024-12-12 13:01:33

Java实现在图片中嵌入字符串的相关文章

转义字符-java,scanner输入的字符串,如输入yes判断却不等于yes

问题描述 java,scanner输入的字符串,如输入yes判断却不等于yes 贴一贴 package test; import java.util.Scanner; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Scanner scan=new Scanner(System.in); System.out.println("input now&quo

java字节数组转字符串

问题描述 java字节数组转字符串 我有一个data[30] 的字节数组,这里面有字符信息,但是不全是,我如何能只取出其中的字符串. 解决方案 那你要给字符串下个定义,比如说从哪个字节开始,或者有什么特征,或者它仅由哪些字符构成.如果你能明确这些,可以用诸如正则表达式,subString indexOf等方式获取.

java取两个字符串的最大交集_java

本文实例讲述了java取两个字符串的最大交集的实现方法,分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package com.itheima.net; public class Game13 {     public static void main(String[] args)     {         String s1 = "135adbfg67";         String s2 = "125dbf59";         Strin

java map转json字符串

问题描述 java map转json字符串 使用dom4j解析xml后,写了一周总是出现各种bug,最后终于找到原因了,原来是JsonObject转换的内部有过滤.最后写成map格式.但不知道怎么把map转成json. ps:本来打算使用正则替换,看了看,难度太大了 解决方案 用StringWriter 然后再用 ObjectMapper 里面的writevalue()方法 进行 替换 解决方案二: 网上收个转json的jar包,都支持map转json 解决方案三: 用谷歌的gson包直接转 解

java 正则表达式-这条java中的替换字符串的正则表达式是什么意思?能不能详细解释一下

问题描述 这条java中的替换字符串的正则表达式是什么意思?能不能详细解释一下 replaceAll("([^u4e00-u9fa5]{1})([^u4e00-u9fa5]{1})", "$2") 解决方案 在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串.在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容.许多程序设计语言都支持利用正则表达式进行字符串操作.例如,在Perl中就内建了一个功能

gizp-delphi7 如何解压java 压缩的 gzip字符串?我这里总提示data error

问题描述 delphi7 如何解压java 压缩的 gzip字符串?我这里总提示data error 5C 如题,哪位大神知道如何解压gzip字符串?初学delphi 求指导. 解决方案 雇佣一个程序员给你写一个解压缩的控件,你负责拖一个到你的窗口上. 解决方案二: 先试一下用winrar如果能正确解压的话,在delphi里用zlib库来解压

java 正则 截取字符串-java 正则匹配String字符串截取问题

问题描述 java 正则匹配String字符串截取问题 比如现在有这样一个字符串 " A4,80列,三层,带双列线,二等分 白色 1200页/箱 ,10箱/包 " 我需要把它分开处理, "A4,80列,三层,带双列线 ,二等分"作为产品的规格,**"白色"**作为产品的颜色,**"1200页/箱 ,10箱/包"**作为产品的包装,现在我想用正则表达式来匹配,但是不知道怎么取写,我只要能分开获取到,剩下的我就可以处理,现在就是分

正则表达式-Java中如何给字符串加空格

问题描述 Java中如何给字符串加空格 Java中如何在一个字符串中每隔四个字符,加入一个空格,然后再将字符串输入到一个新定义的字符串,如: str1=ADSFBKI89H8H8M8J8F8T9%Th09I; 我需要每隔四个加一个空格,有几种实现方法?? 解决方案 给一种实现,直接上代码...... import java.util.Arrays; public class Test09 { public static void main(String[] args) { String old=

输入输出-Java中如何将字符串转化为字节数组,并输出

问题描述 Java中如何将字符串转化为字节数组,并输出 Java中如何将字符串转化为字节数组,并输出,比如得到的输入为 :String str="我是好学生,My name is Studentdaiwei!" 转化为字节数组中,并输出 又如何将字节数组转化为比特数组并输出 解决方案 这个涉及编码的问题,不同的编码输出的字节不同.用getByteshttp://blog.csdn.net/zheng0518/article/details/11532815 解决方案二: String