package com.xxx.parse;
/**
* 图片解析接口
*
* @author XXX
*/
public interface ImgParser
{
/**
* @param priceUrl 图片路径
* @return 图片上的价格
*/
public String getImgText(String priceUrl);
}
package com.xxx.parse.imgparser;
import java.awt.image.BufferedImage;
import java.net.URL;
import javax.imageio.ImageIO;
import com.xxx.parse.ImgParser;
/**
* 图片价格解析(模板模式)
*
* @author XXX
*/
public abstract class AbstractPngImgParser implements ImgParser
{
static
{
System.setProperty("com.sun.media.jai.disableMediaLib", "true");
}
@Override
public String getImgText(String priceUrl)
{
StringBuilder price = new StringBuilder("暂无报价");
// 图片上的数字
if (null == priceUrl || "".equals(priceUrl.trim()))
{
return price.toString();
}
try
{
// 获取图片
URL imgUrl = new URL(priceUrl);
BufferedImage priceImage = ImageIO.read(imgUrl);
// 若图片为空,则返回空
if (null == priceImage)
{
return price.toString();
}
// 将价格图片分割的数量
int num = getCount(priceImage);
if (-1 == num)
{
return price.toString();
}
// 分割的小图片
BufferedImage[] priceChars = new BufferedImage[num];
// 开始切割的X像素
int startX = getStartX();
// 开始切割的Y像素
int startY = getStartY();
// 字符的宽度
int width = getWidth();
// 字符的高度
int height = getHeight();
// 清空价格字符串
price.delete(0, price.length());
for (int i = 0; i < num; i++)
{
// 切割图片
priceChars[i] = priceImage.getSubimage(startX + i * width, startY, width, height);
// 获取图片上单个数字
price.append(getPriceNum(priceChars[i]));
}
}
catch (Exception e)
{
return price.toString();
}
return price.toString();
}
/**
* 解析单个图片
*
* @param priceImage 单个数字图片
* @return 图片上的数字
*/
private int getPriceNum(BufferedImage priceImage)
{
int priceNum = -1;
if (null == priceImage)
{
return priceNum;
}
// 因为是二值图像,这里的方法将像素读取出来的同时,转换为0,1的图像数组。
int width = priceImage.getWidth(null);
int height = priceImage.getHeight(null);
int[] pix = new int[width * height];
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
pix[i * (width) + j] = priceImage.getRGB(j, i);
if (pix[i * (width) + j] == -1)
{
pix[i * (width) + j] = 0;
}
else
{
pix[i * (width) + j] = 1;
}
}
}
// 模板数组 0-9
int[][] templetNum = getTempletNum();
// 将图像数组与模板数字 0-9匹配,获取误差最小的一个数字
int errorMaxValue = 100;
for (int target = 0; target <= 9; target++)
{
int errorValue = 0;
for (int i = 0; i < pix.length; i++)
{
errorValue += Math.abs(pix[i] - templetNum[target][i]);
}
if (errorValue == 0)
{
priceNum = target;
break;
}
else if (errorValue < errorMaxValue)
{
errorMaxValue = errorValue;
priceNum = target;
}
}
return priceNum;
}
/**
* @param image 价格图片
* @return 图片上数字的有效位数
*/
protected abstract int getCount(BufferedImage image);
/**
* @return 图片的数字0~9对应的模板数组
*/
protected abstract int[][] getTempletNum();
/**
* @return 图片X轴的开始像素
*/
protected abstract int getStartX();
/**
* @return 图片X轴的开始像素
*/
protected abstract int getStartY();
/**
* @return 图片字符的宽度
*/
protected abstract int getWidth();
/**
* @return 图片字符的高度
*/
protected abstract int getHeight();
}
package com.xxx.parse.imgparser;
import java.awt.image.BufferedImage;
import com.xxx.ImgConstant;
/**
* xx价格图片解析
*
* @author XXX
*/
public class XxxPngImgParser extends AbstractPngImgParser
{
@Override
public int getCount(BufferedImage image)
{
if (null == image)
{
return -1;
}
else if (image.getWidth() == 110)
{
return 5;
}
else if (image.getWidth() == 97)
{
return 4;
}
else if (image.getWidth() == 81)
{
return 3;
}
else if (image.getWidth() == 70)
{
return 2;
}
else if (image.getWidth() == 60)
{
return 1;
}
else
{
return -1;
}
}
@Override
public int[][] getTempletNum()
{
return ImgConstant.XxxValue;
}
@Override
public int getStartX()
{
return 19;
}
@Override
public int getStartY()
{
return 0;
}
@Override
public int getWidth()
{
return 11;
}
@Override
public int getHeight()
{
return 22;
}
}
分享到:
相关推荐
今天,我们将深入解析一款特别针对狂欢节海报设计的PS模板——“狂欢节海报深色线条PS模板”。这款模板不仅提供了丰富的PSD资源,还细分了图层,并提供了透明PNG格式的图像素材,为设计师们搭建了一个高效且灵活的...
设计模式是软件工程中的重要概念,它们是针对特定问题的通用解决方案模板,可以提高代码的可读性、可维护性和可扩展性。在SVG图表和图标交互的场景中,以下几种设计模式可能特别有用: 1. 观察者模式:当图标的状态...
这篇内容将深入解析“绚丽漂亮好看的狂欢双十二海报模板(PS设计师素材资源、PSD源文件格式图片下载、细分各图层 透明图PNG).zip”这一压缩包中的核心知识点,主要关注PSD文件以及它在设计领域的应用。 首先,我们...
1. 单页网站设计:这种设计模式将所有信息放在一个长页面中,通过滚动浏览,减少了用户的导航负担,适用于介绍型网站或者展示特定项目。 2. 航天卫星主题:此类模板通常会包含与航天卫星相关的元素,如太空图片、...
《PSD网页模板在前端设计中的应用与解析》 标题中的“BL-186_psd网页模板_网站psd效果图切片_PSD欧美日韩风格前端页面.zip”揭示了这个压缩包的内容,主要是一组以PSD格式设计的网页模板,其中包含了欧美日韩等多种...
《PSD网页模板在前端设计中的应用与解析》 网页设计是互联网行业中至关重要的一环,它不仅决定了网站的视觉效果,还影响着用户体验。而PSD(Photoshop Document)文件作为Adobe Photoshop软件的专用格式,广泛应用...
Struts2是基于MVC设计模式的Java Web框架,它提供了一种结构化的方式来组织和控制应用程序的行为。在处理HTML转图片的场景中,我们可以利用Struts2的Action类来接收请求,并进行相应的处理。 1. **HTML转图片基础**...
《文艺清新海报PSD模板——创意设计与PS技术解析》 在平面设计领域,PSD模板扮演着重要的角色,尤其对于新手设计师来说,它们提供了快速创作高质量作品的基础。本资源包“文艺清新海报PSD模板”是专为PS设计师打造...
3. **模板方法设计模式**:在模板方法模式中,迭代器模式常用于遍历步骤。 4. **增强for循环(foreach)**:Java的增强for循环本质上是迭代器模式的一个语法糖。 ### 源码分析 在给定的压缩包文件中,"Design...
010 Editor以其强大的模板语言著称,用户可以通过自定义模板解析各种文件结构。 2. **BMP(位图图像)**:BMP是Windows操作系统中常见的未压缩图像文件格式,它存储了像素信息,通常用于保存图片。010 Editor可以...
《PSD网页模板设计与前端页面制作解析》 在网页设计领域,PSD(Photoshop Document)文件格式因其丰富的编辑功能和高效的可视化设计而被广泛使用。本篇将围绕"GR-098_psd网页模板_网站psd效果图切片_PSD欧美日韩...
代码分析部分可能包含了对JSP语法、Servlets、JDBC(Java Database Connectivity)以及MVC(Model-View-Controller)设计模式的解析,帮助开发者理解如何与数据库进行交互,处理用户请求,并呈现动态数据。...
这篇内容将深入解析“男士半身企业形象照PSD模板”这一主题,涵盖Photoshop(PS)的基础知识、PSD文件格式以及如何使用这些模板来创建专业的企业形象照。 首先,PSD是Adobe Photoshop的专用文件格式,它保存了图像...
【标题】"PSD婚纱模板下载"所涉及的知识点...以上就是“PSD婚纱模板下载”相关知识点的详细解析,涵盖了文件格式、设计应用、版权意识、学习资源等多个方面。希望这些信息能帮助到需要使用这类模板的设计师和爱好者。
4. 设计元素:这些图片可以作为设计中的基本元素,用于网站、PPT、海报、广告等,通过视觉传达时间概念。 5. 图片编辑软件:如Adobe Photoshop、GIMP等,可用于编辑、调整这些图片以适应特定需求。 6. 下载与解压...
3. 设计趋势:模板可能包含当前流行的设计元素,如大图背景、扁平化设计、暗黑模式、卡片式布局等。 4. 移动优先:考虑到移动设备的普及,模板设计通常遵循移动优先原则,先优化移动端体验,再扩展到桌面端。 5. ...
《恩斯道数码2号模板使用手册》详细解析 恩斯道数码2号模板是一款专为Web平台设计的模板,旨在提升网站的用户体验和视觉效果。本模板支持多种主流浏览器,包括IE6、7、8、9以及谷歌、搜狗、360和火狐的最新稳定版本...
它是在MVC(Model-View-Controller)设计模式的基础上构建的,旨在简化开发过程并提供更好的结构化应用。Struts2的核心在于其拦截器机制,使得业务逻辑、控制流和视图层可以更加清晰地分离。 首先,我们来深入理解...
LVGL图片转换工具是一款专为LVGL框架设计的实用软件,它使得开发者能够方便地将普通图像文件转换成LVGL可以识别的C语言源代码文件。这个工具采用图形化用户界面,提供直观的操作流程,无论是单个图片还是整个文件夹...
《PSD网页模板与前端页面设计深度解析》 在当今数字化时代,网页设计与前端开发是互联网行业不可或缺的重要环节。本资源"GR-274_psd网页模板_网站psd效果图切片_PSD欧美日韩风格前端页面.zip"正是为这一领域提供了...