在自动化测试中,除了普通的值验证,经常还有一些图片验证,比如图片的匹配率,输出图片的差异图片等。本文主要用到了BufferedImage类来操作图片比对和输出差异图片,大体的思路如下:

1. 通过ImageIO读入图片,生成相应的BufferedImage实例(Image操作流)

2. 修改目标图片的尺寸大小,以适应期望图片的大小(为像素比对做准备)

3. 获取每一个(width,height)的ARGB,并获取相应的Red, Green,Blue的值

4. 按照每个像素点的R,G,B进行比较(需要定义允许的R,G,B的误差)

5. 统计不同的像素点,生成diff图片

代码如下:

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

for(int w=0;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");

}

}

Java 比较图片_Java图片比对相关推荐

  1. java如何处理灰度图片_Java图片的灰度处理方法

    通过看网上各种大牛的总结,和自己亲身测试总结一下Java图片的灰度处理方法 (1)我们熟知的图片中的像素点有RGB值. (2)图片灰度化的方式大概分为四种,第一种是最大值法(取颜色RGB中的最大值作为 ...

  2. java ftp传图片_Java 图片上传方式一 : ftp 图片服务器

    一 : Linux ftp 图片服务器 1. Linux 安装 ftp linux服务器配置 安装ftp yum install vsftpd 启动服务 service vsftpd start 开机 ...

  3. java 水印处理_java 图片水印处理

    //main方法 Font font = new Font("微软雅黑", Font.PLAIN, 90); //水印字体 String srcImgPath = "C: ...

  4. java 水印排版_java图片加水印代码 最好有实例!!!先谢了!!

    展开全部 文字水印 import java.awt.*; import java.awt.image.*; import java.io.*; import javax.swing.*; import ...

  5. java 像素矩阵_Java图片读取之BufferedImage得到像素矩阵的两种方式

    最近在尝试着采用Java在图像处理领域实践一下常用的机器学习算法.首先涉及到的是如何将一副图片读取到一个像素矩阵中(Java中就是一维或二维数组中).在实践过程中,通过测试代码,我发现基于Buffer ...

  6. Java滑动验证_java图片滑动验证(登录验证)原理与实现方法详解

    本文实例讲述了java图片滑动验证(登录验证)原理与实现方法.分享给大家供大家参考,具体如下: 这是我简单做出的效果图,处理300X150px的校验图,并把图片发到前端,用时50毫秒左右,速度还是非常 ...

  7. java打包 图片_Java 图片爬虫,java打包jar文件

    [TOC] 1. Java 图片爬虫,制作 .jar 文件 spider.java spider.java 高清图片api : https://www.xwboke.cn/api/api.php ,每 ...

  8. java上传图片方法_java 图片上传方法

    /*** 点击上传照片功能*/ publicString writeImg(){try{ HttpServletRequest request=WebUtils.getRequest();//requ ...

  9. java批量上传图片_JAVA图片批量上传JS-带预览功能

    这篇文章就简单的介绍一个很好用的文件上传工具,批量带预览功能.直接贴代码吧,都有注释,很好理解. HTML页面 pageEncoding="UTF-8"%> 新增照片 var ...

最新文章

  1. Data Science | 数据分析
  2. html表单上传图片获取路径,asp.net获取HTML表单File中的路径的方法
  3. pytorch 实现transformer
  4. 如何删除 Windows.old 文件夹
  5. 安装Android模拟器Genymotion【Android学习入门】
  6. 解决 E: Unable to correct problems, you have held broken packages. 问题
  7. Android 拍照、从相册选择图片
  8. Linux指令日期转为字符串,linux时间转换函数【转】
  9. gridview 导成Excel
  10. stack 和 heap区别
  11. 【解题报告】表达式求值(栈,表达式树)
  12. Photoshop CS6 破解
  13. 应用层协议和传输层协议
  14. RAID1与RAID0的区别
  15. qq服务器上的文件删除后如何恢复,QQ文件失效怎么恢复(过期的QQ文件如何申请恢复)...
  16. 微型计算机机箱配什么显卡,CPU显卡搭配建议
  17. java绘制五角星_JAVA 五角星小程序
  18. cesium中长度测量和面积测量
  19. C语言对称矩阵的判定
  20. Unirech:阿里云国际云服务器ecs建站流程

热门文章

  1. win7怎么看计算机显卡内存大小,显存,教您怎么看电脑的显存
  2. 如何在网页中插入视频(简单实用)
  3. 安装Brat标记工具
  4. 金属,还是Disturbed的好。
  5. p标签中的文字垂直居中
  6. IEEE Access 算法 伪代码排版出错
  7. vue生成app二维码,并扫码下载app
  8. 微信公众号文章信息(阅读量、在看、点赞数)获取
  9. 在Nginx中正确返回HTTPS/SSL错误
  10. 【通信】盖氏圆盘方法(GDE)计算均匀直线阵(ULA)中信号源个数附matlab代码