在自动化测试中,除了普通的值验证,经常还有一些图片验证,比如图片的匹配率,输出图片的差异图片等。本文主要用到了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<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");
}
}

  

Java图片比对的更多相关文章

  1. Atitit.java图片图像处理attilax总结

    Atitit.java图片图像处理attilax总结 BufferedImage extends java.awt.Image 获取图像像素点 image.getRGB(i, lineIndex); ...

  2. Atitit.java图片图像处理attilax总结  BufferedImage extends java.awt.Image获取图像像素点image.getRGB(i, lineIndex); 图片剪辑/AtiPlatf_cms/src/com/attilax/img/imgx.javacutImage图片处理titit 判断判断一张图片是否包含另一张小图片 atitit 图片去噪算法的原理与

    Atitit.java图片图像处理attilax总结 BufferedImage extends java.awt.Image 获取图像像素点 image.getRGB(i, lineIndex); ...

  3. Java 图片提取RGB数组 RGBOfCharMaps (整理)

    package demo; /** * Java 图片提取RGB数组 RGBOfCharMaps (整理) * 声明: * 和ImageCombining配合使用的工具,这里是提取图片的R.G.B生成 ...

  4. Java 图片转换为字符图 CharMaps (整理)

      /* * Java 图片转换成字符图 CharMaps (整理) * * 2016-1-2 深圳 南山平山村 曾剑锋 * * @(#)CharMaps.java 2014/1/16 * 1.这个一 ...

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

    基于Java图片数据库Neo4j 3.0.0发布 全新的内部架构 Neo4j 3.0.0 正式发布,这是 Neo4j 3.0 系列的第一个版本.此版本对内部架构进行了全新的设计;提供给开发者更强大的生 ...

  6. java图片上传(mvc)

    最近有开始学起了java,好久没写文章了,好久没来博客园了.最近看了看博客园上次写的图片上传有很多人看,今天在一些篇关于java图片上传的.后台接收用的是mvc.不墨迹了,直接上图. 先看目录结构.i ...

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

    simpleImageTool又一个简单.好用的图片格式转换.缩放水印叠加等功能的纯Java图片工具库. simpleImageTool的由来,近期需要用到图片处理,通过网上的图片流直接进行缩放水印叠 ...

  8. Java 图片处理解决方案:ImageMagick 快速入门

    一.ImageMagick介绍 ImageMagick是一个免费的创建.编辑.合成图片的软件,可以实现图片切割.颜色替换.图片缩略图.图片水印等各种效果.ImageMagick是免费开源软件,支持大多 ...

  9. java图片处理开源框架

    java图片处理开源框架 以前一直不明白,java开源框架什么意思,搜集资料得出以下结论 其实java框架可以理解为一个工具或者一个插件,将一个公用的.常用的技术封装起来,处理一些基础的.繁琐的问题. ...

  10. Java图片加文字水印

    Java图片加文字水印 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.I ...

随机推荐

  1. 搭建Spark所遇过的坑

    一.经验 1.Spark Streaming包含三种计算模式:nonstate .stateful .window 2.kafka可通过配置文件使用自带的zookeeper集群 3.Spark一切操作 ...

  2. Alpha、伪Beta 发布个人感想与体会

    1.Alpha版本 在Alpha版本发布时,我在Fantacy组,那时的体会我已在前面写过,现在回想起来,我觉得自己的决定似乎做的并不是很糟糕,因为来到新的团队里,我学到了很多东西,认识了很多技术很好 ...

  3. CUDA ---- Warp解析

    Warp 逻辑上,所有thread是并行的,但是,从硬件的角度来说,实际上并不是所有的thread能够在同一时刻执行,接下来我们将解释有关warp的一些本质. Warps and Thread Blo ...

  4. 洛谷P3066 [USACO12DEC]逃跑的BarnRunning Away From…

    题面链接 一句话题意:给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于l的点有多少个. 我:似乎并不好做啊...看了题解后大雾... sol:考虑树上差分,对于一个点,在他那个位置++, ...

  5. poj1850-CODE-组合

    求出给定序列的序号.有一个定理需要知道 具体看这篇博客吧http://blog.csdn.net/lyy289065406/article/details/6648492 #include <c ...

  6. poj1753 【枚举】

    Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 square ...

  7. 沉迷Link-Cut tree无法自拔之:[BZOJ2594][Wc2006]水管局长数据加强版

    来自蒟蒻 \(Hero \_of \_Someone\) 的 \(LCT\) 学习笔记 $ $ 这应该算是道套路题吧, 如果将图中的边转换成点, 再将边权变点权, 就可以用 \(LCT\) 来维护了 ...

  8. Surrounded Regions - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 https://leetcode.com/problems/surrounded-regions/ 注意点 边缘不算包围'O' 解法 解法一:dfs.找处 ...

  9. Visualbox在UEFI模式下无法正常引导

    引子 前几天VMware Workstation Pro 14发布了,从12更新到14之后,很多的虚拟机开启后都黑屏.实际并非黑屏,在控制台视图可以看到屏幕的缩略图是正常显示的.目前还没有找到解决方案 ...

  10. 4月1日->-4月15日 2周阶段性计划

    4月1日->4月14日 ST表 树状数组 LCA 一周的时间,力求掌握这三个知识点并各刷五道题左右. 树状数组 ST表 LCA 然而:进展总比计划快(......什么鬼) 树状数组刷了5题,ST ...