`
SpaceCity
  • 浏览: 99128 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

普通png图片解析(设计模式之模板模式)

阅读更多
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).zip

    今天,我们将深入解析一款特别针对狂欢节海报设计的PS模板——“狂欢节海报深色线条PS模板”。这款模板不仅提供了丰富的PSD资源,还细分了图层,并提供了透明PNG格式的图像素材,为设计师们搭建了一个高效且灵活的...

    batik .jar 与设计模式

    设计模式是软件工程中的重要概念,它们是针对特定问题的通用解决方案模板,可以提高代码的可读性、可维护性和可扩展性。在SVG图表和图标交互的场景中,以下几种设计模式可能特别有用: 1. 观察者模式:当图标的状态...

    绚丽漂亮好看的狂欢双十二海报模板(PS设计师素材资源、 PSD源文件格式图片下载、细分各图层 透明图PNG).zip

    这篇内容将深入解析“绚丽漂亮好看的狂欢双十二海报模板(PS设计师素材资源、PSD源文件格式图片下载、细分各图层 透明图PNG).zip”这一压缩包中的核心知识点,主要关注PSD文件以及它在设计领域的应用。 首先,我们...

    航天卫星主题网站模板是一款个性设计公司单页网站模板 .rar

    1. 单页网站设计:这种设计模式将所有信息放在一个长页面中,通过滚动浏览,减少了用户的导航负担,适用于介绍型网站或者展示特定项目。 2. 航天卫星主题:此类模板通常会包含与航天卫星相关的元素,如太空图片、...

    BL-186_psd网页模板_网站psd效果图切片_PSD欧美日韩风格前端页面.zip

    《PSD网页模板在前端设计中的应用与解析》 标题中的“BL-186_psd网页模板_网站psd效果图切片_PSD欧美日韩风格前端页面.zip”揭示了这个压缩包的内容,主要是一组以PSD格式设计的网页模板,其中包含了欧美日韩等多种...

    BL-196_psd网页模板_网站psd效果图切片_PSD欧美日韩风格前端页面.zip

    《PSD网页模板在前端设计中的应用与解析》 网页设计是互联网行业中至关重要的一环,它不仅决定了网站的视觉效果,还影响着用户体验。而PSD(Photoshop Document)文件作为Adobe Photoshop软件的专用格式,广泛应用...

    Java 保存HTML为图片

    Struts2是基于MVC设计模式的Java Web框架,它提供了一种结构化的方式来组织和控制应用程序的行为。在处理HTML转图片的场景中,我们可以利用Struts2的Action类来接收请求,并进行相应的处理。 1. **HTML转图片基础**...

    文艺清新海报PSD模板(PS设计师素材资源、图层源文件下载).zip

    《文艺清新海报PSD模板——创意设计与PS技术解析》 在平面设计领域,PSD模板扮演着重要的角色,尤其对于新手设计师来说,它们提供了快速创作高质量作品的基础。本资源包“文艺清新海报PSD模板”是专为PS设计师打造...

    Iterator Pattern(迭代模式)

    3. **模板方法设计模式**:在模板方法模式中,迭代器模式常用于遍历步骤。 4. **增强for循环(foreach)**:Java的增强for循环本质上是迭代器模式的一个语法糖。 ### 源码分析 在给定的压缩包文件中,"Design...

    010editor bt 合集

    010 Editor以其强大的模板语言著称,用户可以通过自定义模板解析各种文件结构。 2. **BMP(位图图像)**:BMP是Windows操作系统中常见的未压缩图像文件格式,它存储了像素信息,通常用于保存图片。010 Editor可以...

    GR-098_psd网页模板_网站psd效果图切片_PSD欧美日韩风格_前端页面.zip

    《PSD网页模板设计与前端页面制作解析》 在网页设计领域,PSD(Photoshop Document)文件格式因其丰富的编辑功能和高效的可视化设计而被广泛使用。本篇将围绕"GR-098_psd网页模板_网站psd效果图切片_PSD欧美日韩...

    动态招生网站JSp网站设计模板

    代码分析部分可能包含了对JSP语法、Servlets、JDBC(Java Database Connectivity)以及MVC(Model-View-Controller)设计模式的解析,帮助开发者理解如何与数据库进行交互,处理用户请求,并呈现动态数据。...

    男士半身企业形象照PSD模板

    这篇内容将深入解析“男士半身企业形象照PSD模板”这一主题,涵盖Photoshop(PS)的基础知识、PSD文件格式以及如何使用这些模板来创建专业的企业形象照。 首先,PSD是Adobe Photoshop的专用文件格式,它保存了图像...

    PSD婚纱模板下载

    【标题】"PSD婚纱模板下载"所涉及的知识点...以上就是“PSD婚纱模板下载”相关知识点的详细解析,涵盖了文件格式、设计应用、版权意识、学习资源等多个方面。希望这些信息能帮助到需要使用这类模板的设计师和爱好者。

    所需要的时间图片压缩包

    4. 设计元素:这些图片可以作为设计中的基本元素,用于网站、PPT、海报、广告等,通过视觉传达时间概念。 5. 图片编辑软件:如Adobe Photoshop、GIMP等,可用于编辑、调整这些图片以适应特定需求。 6. 下载与解压...

    TM-0372_企业网站网页源码欧美前端模板.zip

    3. 设计趋势:模板可能包含当前流行的设计元素,如大图背景、扁平化设计、暗黑模式、卡片式布局等。 4. 移动优先:考虑到移动设备的普及,模板设计通常遵循移动优先原则,先优化移动端体验,再扩展到桌面端。 5. ...

    恩斯道数码2号模板使用手册

    《恩斯道数码2号模板使用手册》详细解析 恩斯道数码2号模板是一款专为Web平台设计的模板,旨在提升网站的用户体验和视觉效果。本模板支持多种主流浏览器,包括IE6、7、8、9以及谷歌、搜狗、360和火狐的最新稳定版本...

    struts2 原理 解析 图

    它是在MVC(Model-View-Controller)设计模式的基础上构建的,旨在简化开发过程并提供更好的结构化应用。Struts2的核心在于其拦截器机制,使得业务逻辑、控制流和视图层可以更加清晰地分离。 首先,我们来深入理解...

    LVGL图片转换工具图片转换工具

    LVGL图片转换工具是一款专为LVGL框架设计的实用软件,它使得开发者能够方便地将普通图像文件转换成LVGL可以识别的C语言源代码文件。这个工具采用图形化用户界面,提供直观的操作流程,无论是单个图片还是整个文件夹...

    GR-274_psd网页模板_网站psd效果图切片_PSD欧美日韩风格前端页面.zip

    《PSD网页模板与前端页面设计深度解析》 在当今数字化时代,网页设计与前端开发是互联网行业不可或缺的重要环节。本资源"GR-274_psd网页模板_网站psd效果图切片_PSD欧美日韩风格前端页面.zip"正是为这一领域提供了...

Global site tag (gtag.js) - Google Analytics