Java图片比对

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;

public class ImageDiff {

    //不同的像素标记为红色
    public static final int RGB_RED = 16711680;

    //允许的Red,Green,Blue单个维度的像素差值
    public static final int DIFF_ALLOW_RANGE = 5;

    //不同像素点统计值
    public static int diffPointCount = 0;

    //从rgb值中抽取red
    public static int getRed(int rgbValue){
        return rgbValue & 0xff0000 >> 16;
    }

    //从rgb值中抽取green
    public static int getGreen(int rgbValue){
        return rgbValue & 0xff00 >> 8;
    }

    //从rgb值中抽取blue
    public static int getBlue(int rgbValue){
        return rgbValue & 0xff;
    }

    /**
     * 比较两图片,并用红色标出不同的像素点,然后保存差异图片到本地,打印匹配率
     * @param srcImgPath
     * @param targetImgPath
     */
    public static void compareImages(String srcImgPath,String targetImgPath){
        try {
            BufferedImage srcImg = ImageIO.read(new File(srcImgPath));
            BufferedImage targetImg = ImageIO.read(new File(targetImgPath));

            diffPointCount = 0;
            BufferedImage diffImg = srcImg;

            int srcHeight = srcImg.getHeight();
            int srcWidth = srcImg.getWidth();

            //修改待比较图片的尺寸以适应源图片的尺寸
            targetImg = changeImageSize(targetImg,srcHeight,srcWidth);

            int srcRgb;
            int targetRgb;

            for(int h = 0;h<srcHeight;h++){
                for(int w=0;w<srcWidth;w++){
                    srcRgb = srcImg.getRGB(w,h);
                    targetRgb = targetImg.getRGB(w,h);
                    if( Math.abs(getRed(srcRgb) - getRed(targetRgb))>DIFF_ALLOW_RANGE ||
                            Math.abs(getGreen(srcRgb) - getGreen(targetRgb))>DIFF_ALLOW_RANGE||
                            Math.abs(getBlue(srcRgb) - getBlue(targetRgb))>DIFF_ALLOW_RANGE){
                        diffImg.setRGB(w,h, RGB_RED);
                        diffPointCount++;
                    }
                }
            }

            //保存差异图片
            ImageIO.write(diffImg,"jpg",new File("diffImg.jpg"));
            System.out.println("保存差异图片成功!");

            //计算相似度(保留小数点后四位)
            int totalPixel = srcHeight*srcWidth;
            DecimalFormat decimalFormat = new DecimalFormat("#.####");
            double matchRate = (totalPixel-diffPointCount)/(totalPixel*1.0);

            System.out.println("图片相似度为: "+decimalFormat.format(matchRate)+"%");

        }catch (Exception ex){
            ex.printStackTrace();
        }
    }

    /**
     * 修改BufferedImage中的图片尺寸,以便和源图片进行比较
     * @param image
     * @param newHeight
     * @param newWidth
     * @return
     */
    public static BufferedImage changeImageSize(BufferedImage image,int newHeight,int newWidth){
        Image img = image.getScaledInstance(newWidth,newHeight,Image.SCALE_SMOOTH);
        int width = img.getWidth(null);
        int height = img.getHeight(null);

        //获取新图片的BufferedImage实例
        BufferedImage newBufferedImage = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_ARGB);
        Graphics g = newBufferedImage.getGraphics();
        g.drawImage(img, 0, 0, null);
        g.dispose();
        return newBufferedImage;
    }

    public static void main(String[] args){
        compareImages("1.jpg","2.jpg");
    }
}

  

时间: 2024-10-17 01:49:22

Java图片比对的相关文章

java 图片压缩变色问题

java图片压缩,有时由于图片自身的原因,如透明的PNG图.改alpha通道或四色图等. 压缩完了,会出现图片变色的情况. 如: 原图 压缩完: 尝试了很多方法,如JDK原生的方式及第三方组件java-image-scaling或thumbnailator都不解决问题. 后来采用阿里的SimpleImage解决.记录一下 SimpleImage github地址:https://github.com/alibaba/simpleimage依赖jar:commons-io-2.4.jarcommo

java图片上传(mvc)

最近有开始学起了java,好久没写文章了,好久没来博客园了.最近看了看博客园上次写的图片上传有很多人看,今天在一些篇关于java图片上传的.后台接收用的是mvc.不墨迹了,直接上图. 先看目录结构.idea开发. 一.图片上传还是使用的这款jq插件.前端部署这款插件,不用说了吧.效果图       二.前台代码只需要盖一个位置.因为是比较好用的插件.插件样式自行修改. 三.后台代码. 后面看不见的. 这个图片上传主要是自己写了几个函数.让图片储存更加方便.分成了年月日储存.但是后期遍历比较困难,

基于Java图片数据库Neo4j 3.0.0发布 全新的内部架构

基于Java图片数据库Neo4j 3.0.0发布 全新的内部架构 Neo4j 3.0.0 正式发布,这是 Neo4j 3.0 系列的第一个版本.此版本对内部架构进行了全新的设计;提供给开发者更强大的生产力;提供更广阔的部署选择.Neo4j 3.0 被认为是世界上最具伸缩性的基于Java的图片数据库. Neo4j 3.0.0 主要的新特性: Neo4j 3.0 新特性架构图 全新设计了内部架构移除了所有节点数量限制,数据库关系和属性都可以被存储和索引提供官方支持语言驱动器 (Java.JavaSc

java 图片裁剪上传变红等失真现象、cmyk颜色模式图片裁剪异常现象处理

1.本文仅为了提供图片上传过程中,部分java图片处理代码. 2.以下代码可以解决部分图片上传裁剪后整体变红等失真现象. 3.以下代码支持cmyk颜色模式的图片上传裁剪. /**  * 图片裁剪  * @param srcImageFile 裁剪前图片地址  * @param dirImageFile 裁剪后图片地址  * @param x   图片裁剪属性  * @param y   图片裁剪属性  * @param destWidth  图片裁剪属性  * @param destHeight

Java 图片读取与存储

1 @Override 2 public Image myWrite(Image image, String filePath) throws IOException { 3 if (image == null) { 4 throw new IOException("Image is null!"); 5 } 6 7 // create a file 8 File imgFile = new File(filePath + ".bmp"); 9 BufferedIm

java图片验证码包括文字和图片的旋转

java图片验证码包括文字图片的旋转: 此例子演示的是两位数的加减运算,需要的可以通过自己的修改获得更多的方式: 或者我上传的资源中也有其他的两种方式供选择:http://download.csdn.net/detail/huitoukest/8043711 package com.utils; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; im

java 图片缩放

使用java自带的图片处理api,也可以使用(GraphicsMagick + im4j) import java.awt.Image; import java.awt.image.BufferedImage; Image img = ImageIO.read(file.getInputStream());//读入图片 BufferedImage tag = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB); /

js 利用iframe和location.hash跨域解决办法,java图片上传回调JS函数跨域

奶奶的:折腾了我二天,终于解决了!网上有很多例子. 但跟我的都不太一样,费话不多说了,上图   上代码: IE ,firefix,chrome 测试通过 js :这个主页面,部分代码, function submitUpload(id){ $("#imgSrc" + id +"").attr("alt", "图片上传中--"); var imgID = id; if(id>0){ imgID = 1; } var for

java图片裁剪处理工具类代码

剪切前:  原文:java图片裁剪处理工具类代码 源代码下载地址:http://www.zuidaima.com/share/1550463351786496.htm 剪切后:  package com.zuidaima.zhangjun.image; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import

simpleImageTool又纯java图片水印、缩放工具

simpleImageTool又一个简单.好用的图片格式转换.缩放水印叠加等功能的纯Java图片工具库. simpleImageTool的由来,近期需要用到图片处理,通过网上的图片流直接进行缩放水印叠加等,需要一个纯java的处理库,在网上找一下没有符合我的库,要么是太老很多还是jdk1.6以前的,要么是功能不够好.找到阿里的simpleimage功能还算完善,1.7环境下想使用很麻烦,还要搞JAI的包,在改simpleimage(JPG图片处理相关的用新的ImageIO方式处理已经改好)时发现