游程长度编码

中文名称:游程长度编码

英文名称:run-length coding;RLC


定义:为减少传真信号的冗余度,而对连续的相同光密度像素的扫描游程长度(以像素数来表示)进行编码的方法。


游程长度编码(run-length code)   游程长度编码是栅格数据压缩的重要编码方法,它的基本思路是:对于一幅栅格图像,常常有行(或列)方向上相邻的若干点具有相同的属性代码,因而可采取某种方法压缩那些重复的记录内容。其编码方案是,只在各行(或列)数据的代码发生变化时依次记录该代码以及相同代码重复的个数,从而实现数据的压缩。  例如对图1所示的栅格数据,可沿行方向进行如下游程长度编码:  (9,4),(0,4),(9,3),(0,5),(0,1)(9,2),(0,1),(7,2),(0,2),(0,4),(7,2),(0,2),(0,4),(7,4),(0,4),(7,4) ,(0,4),(7,4) ,(0,4),(7,4)  游程长度编码对图3-6(a)只用了40个整数就可以表示,而如果用前述的直接编码却需要64个整数表示,可见游程长度编码压缩数据是十分有效又简便的。事实上,压缩比的大小是与图的复杂程度成反比的,在变化多的部分,游程数就多,变化少的部分游程数就少,图件越简单,压缩效率就越高。  游程长度编码在栅格加密时,数据量没有明显增加,压缩效率较高,且易于检索,叠加合并等操作,运算简单,适用于机器存贮容量小,数据需大量压缩,而又要避免复杂的编码解码运算增加处理和操作时间的情况。  [font id="zoom" class="zoom"]游程长度RL (Run—Length),简称游程或游长,指的是由字符(或信号取样值)构成的数据流中各个字符重复出现而形成的字符的长度.如果给出了形成申的字符,申的长度及申的位置,就能恢复出原来的数据流,游程长度编码(RLC)就是用二进制码字给出这些信息的一类方法。游程长度编码的主要思想是将一个相同值的连续申用其值和申长(重复的个数)的数对二元组来替代.例如,在图像编码中,可以定义沿特定方向上具有相同灰度值的相邻像素为一轮,其延续的长度称之为延续的行程,即游程.游程终点位置由前一游程终点的相对距离确定,这样就可以由灰度游程串来表示图像数据.例如,若沿水平方向有一申M 个像素具有相同的灰度N,则按游程长度编码后,只传递两个值(N,M )就可以代替这M个像素的M个灰度值N。简单来说,游程长度编码的主要任务是统计连续相同字符的个数,解码时要根据字符及连续相同字符的个数,恢复原来的数据.在多媒体信息量激增、网络特性和速度都飞速提高的今天,游程长度编码是一种十分简单的压缩方法,编码/解码的速度也非常快,可广泛应用于多媒体信息的存储,传输。


package com.folkSeal.test;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;

import com.folkSeal.data.Pub;
import com.folkSeal.util.FileOperate;

public class Test {
	public static final String seal_front_color = "000000";//印章前景,黑色
	public static final String seal_back_color = "FFFFFF";//印章北景,白色
	public static final String seal_coding_color = "00FF00";//印章编码,绿色
	public static final String seal_front_feature_color = "0000FF";//前景中的辅助识别特征,蓝色
	public static final String seal_back_feature_color = "FFFF00";//背景中的辅助识别特征,黄色
	
	
	public static void main(String[] args) {
		//Test.test();
		Test test = new Test();
		String [][] arrImagePixel2 = test.getImagePixelByRunLengthCoding("", 80, 80);
		for (int i = 0; i < 80; i++) {
			for (int j = 0; j < 80; j++) {
				System.out.println(arrImagePixel2[i][j]);
			}
		}
	}
    public static void test() {  
        Connection conn = null;  
        Statement stat = null;  
        ResultSet rs = null;  
        StringBuffer stringBuffer = new StringBuffer();  
        stringBuffer.append("<html><head></head><body lang=ZH-CN style='tab-interval:21.0pt;text-justify-trim:punctuation'>");  
        List<Object[]> objArrList = new ArrayList<Object[]>();  
        try {  
            conn = Pub.getConn();  
            stat = conn.createStatement();  
            String sql = "select * from user_tab_comments";  
            System.out.println("sql=="+sql);  
            rs = stat.executeQuery(sql);  
            int i = 0;  
            while (rs.next()) {  
                i ++;  
                String table_name = rs.getString("TABLE_NAME");  
                String comments = rs.getString("COMMENTS");  
                Object[] objArr = new Object[3];   
                objArr[0] = i;  
                objArr[1] = table_name;  
                objArr[2] = comments;  
                objArrList.add(objArr);  
            }  
        } catch (SQLException e) {  
            e.printStackTrace();  
        } finally {  
            Pub.close(conn, stat, rs);  
        }  
          
        for (int i = 0; i < objArrList.size(); i++) {  
            Object[] objArr = objArrList.get(i);  
            String table_name = objArr[1].toString();  
            String comments = objArr[2].toString();  
            stringBuffer.append("<font size=\"5\">").append("<strong>").append(objArr[0].toString()).append("、").append(comments).append("  ").append(table_name).append("</strong>").append("</font>").append("\n");  
            stringBuffer.append("<table border=1 cellspacing=0 cellpadding=0 style='border-collapse:collapse;border:none;mso-border-alt:solid black .5pt; mso-border-themecolor:text1;mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt'>");  
            stringBuffer.append("<tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'>");  
            stringBuffer.append("<td width=95 valign=top style='background-color:#ccc;border:solid black 1.0pt;'>").append("英文名").append("</td>");  
            stringBuffer.append("<td width=95 valign=top style='background-color:#ccc;border:solid black 1.0pt;'>").append("中文名").append("</td>");  
            stringBuffer.append("<td width=95 valign=top style='background-color:#ccc;border:solid black 1.0pt;'>").append("类型").append("</td>");  
            stringBuffer.append("<td width=95 valign=top style='background-color:#ccc;border:solid black 1.0pt;'>").append("长度").append("</td>");  
            stringBuffer.append("<td width=95 valign=top style='background-color:#ccc;border:solid black 1.0pt;'>").append("是否为空").append("</td>");  
            stringBuffer.append("<td width=95 valign=top style='background-color:#ccc;border:solid black 1.0pt;'>").append("主键/外键").append("</td>");  
            stringBuffer.append("</tr>");  
            try {  
                conn = Pub.getConn();  
                stat = conn.createStatement();  
                String sql = "SELECT USER_TAB_COLS.COLUMN_NAME , USER_TAB_COLS.DATA_TYPE, USER_TAB_COLS.DATA_LENGTH,user_tab_cols.DATA_PRECISION,user_tab_cols.DATA_SCALE, USER_TAB_COLS.NULLABLE,user_col_comments.comments FROM USER_TAB_COLS inner join user_col_comments on user_col_comments.TABLE_NAME=USER_TAB_COLS.TABLE_NAME and user_col_comments.COLUMN_NAME=USER_TAB_COLS.COLUMN_NAME and user_col_comments.table_name='"+table_name+"' order by user_tab_cols.COLUMN_ID";  
                System.out.println("sql=="+sql);  
                rs = stat.executeQuery(sql);  
                boolean b = true;  
                while (rs.next()) {  
                    String column_name = rs.getString("column_name");  
                    String data_type = rs.getString("DATA_TYPE");  
                    int data_length = rs.getInt("DATA_LENGTH");  
                    int data_percision = rs.getInt("DATA_PRECISION");  
                    int data_scale = rs.getInt("DATA_SCALE");  
                    String nullable = rs.getString("NULLABLE");  
                    String ccomments = rs.getString("COMMENTS");  
                    String temp_data_length;  
                    if ("NUMBER".equals(data_type)) {  
                        if (data_scale == 0) {  
                            temp_data_length = data_percision+"";  
                        }else {  
                            temp_data_length = data_percision+","+data_scale;  
                        }  
                    }else {  
                        temp_data_length = data_length+ "";  
                    }  
                    String pk ="";  
                    if (b) {  
                        pk = "PK";  
                        b = false;  
                    }  
                    stringBuffer.append("<tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'>");  
                    stringBuffer.append("<td width=95 valign=top style='border:solid black 1.0pt;'>").append(column_name).append("</td>");  
                    stringBuffer.append("<td width=95 valign=top style='border:solid black 1.0pt;'>").append(ccomments).append("</td>");  
                    stringBuffer.append("<td width=95 valign=top style='border:solid black 1.0pt;'>").append(data_type).append("</td>");  
                    stringBuffer.append("<td width=95 valign=top style='border:solid black 1.0pt;'>").append(temp_data_length).append("</td>");  
                    stringBuffer.append("<td width=95 valign=top style='border:solid black 1.0pt;'>").append(nullable).append("</td>");  
                    stringBuffer.append("<td width=95 valign=top style='border:solid black 1.0pt;'>").append(pk).append("</td>");  
                    stringBuffer.append("</tr>");  
                }  
            } catch (SQLException e) {  
                e.printStackTrace();  
            } finally {  
                Pub.close(conn, stat, rs);  
            }  
            stringBuffer.append("</table>");  
            stringBuffer.append("<br>");  
        }  
        stringBuffer.append("</body></html>");  
        FileOperate fo = new FileOperate();  
        fo.createFile("D:\\My Documents\\桌面", "写中文文字.htm");
        fo.writeFile("D:\\My Documents\\桌面\\写中文文字.htm", stringBuffer.toString());  
        System.out.println(stringBuffer.toString());  
    }   
	
	/**
	 * 获得图片的像素RGB值List
	 * @param imageFilePath
	 * @return
	 */
	public List<List<String>> getImagePixelRgbList(String imageFilePath){
		List<List<String>> list = new ArrayList<List<String>>();
		try {
			BufferedImage img = ImageIO.read(new File(imageFilePath));
			int tileHeight = img.getTileHeight();
			int tileWidth = img.getTileWidth();
			for (int y = 0; y < tileHeight; y++) {
				List<String> listX = new ArrayList<String>();
				for (int x = 0; x < tileWidth; x++) {
					listX.add(Integer.toHexString(img.getRGB(x, y)).substring(2));
				}
				list.add(listX);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return list;
	}
	/**
	 * 获得图片的像素RGB值替换后的List
	 * @param imageFilePath
	 * @return
	 */
	public List<List<Integer>> getImagePixelReplaceRgbToIntList(String imageFilePath){
		List<List<Integer>> list = new ArrayList<List<Integer>>();
		try {
			BufferedImage img = ImageIO.read(new File(imageFilePath));
			int tileHeight = img.getTileHeight();
			int tileWidth = img.getTileWidth();
			for (int y = 0; y < tileHeight; y++) {
				List<Integer> listX = new ArrayList<Integer>();
				for (int x = 0; x < tileWidth; x++) {
					String rgbHex = Integer.toHexString(img.getRGB(x, y)).substring(2);
					int intTemp = getImagePixelReplaceRgbToInt(rgbHex);
					listX.add(intTemp);
				}
				list.add(listX);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return list;
	}
	/**
	 * 获得像素颜色替换值
	 * @param rgbHex
	 * @return
	 */
	public int getImagePixelReplaceRgbToInt(String rgbHex) {
		int rgb = 0;
		if (rgbHex.equalsIgnoreCase(seal_front_color)) {
			rgb = 0;
		}else if(rgbHex.equalsIgnoreCase(seal_back_color)) {
			rgb = 1;
		}else if(rgbHex.equalsIgnoreCase(seal_coding_color)) {
			rgb = 2;
		}else if(rgbHex.equalsIgnoreCase(seal_front_feature_color)) {
			rgb = 3;
		}else if(rgbHex.equalsIgnoreCase(seal_back_feature_color)) {
			rgb = 4;
		}else {
			//rgb = 5;
		}
		return rgb;
	}
	/**
	 * 获得像素颜色
	 * @param rgbHex
	 * @return
	 */
	public String getImagePixelColorByInt(int i) {
		String rgbStr = "";
		switch (i) {
		case 0:
			rgbStr = seal_front_color;
			break;
		case 1:
			rgbStr = seal_back_color;
			break;
		case 2:
			rgbStr = seal_coding_color;
			break;
		case 3:
			rgbStr = seal_front_feature_color;
			break;
		case 4:
			rgbStr = seal_back_feature_color;
			break;

		default:
			break;
		}
		return rgbStr;
	}
	/**
	 * 获得二维游程编码
	 * @param list
	 */
	public String getRunLengthCoding(List<List<Integer>> list) {
		String str = "";
		try {
			String arrStr = "";
			StringBuffer sb = new StringBuffer();
			for (int i = 0; i < list.size(); i++) {
				List<Integer> intList = list.get(i);
				int intTemp = -1;
				int countTemp = -1;
				for (int j = 0; j < intList.size(); j++) {
					if (j == 0) {
						countTemp = 1;
						intTemp = intList.get(j);
					}else if (j == intList.size()-1) {
						if (intTemp == intList.get(j)) {
							countTemp = countTemp + 1;
							arrStr = getArrStr(intTemp, countTemp);
							sb.append(arrStr);
							intTemp = -1; 
							countTemp = -1;
						}else {
							arrStr = getArrStr(intTemp, countTemp);
							sb.append(arrStr);
							intTemp = intList.get(j);
							countTemp = 1;
							arrStr = getArrStr(intTemp, countTemp);
							sb.append(arrStr);
							intTemp = -1; 
							countTemp = -1;
						}
					}else {
						if (intTemp == intList.get(j)) {
							countTemp = countTemp + 1;
						}else {
							arrStr = getArrStr(intTemp, countTemp);
							sb.append(arrStr);
							countTemp = 1;
							intTemp = intList.get(j);
						}
					}
				}
			}
			str = sb.toString().substring(0,sb.toString().length()-1);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return str;
	}
	/**
	 * 获得二维游程编码的单个数组
	 * @param intTemp
	 * @param countTemp
	 * @return
	 */
	public String getArrStr(int intTemp,int countTemp) {
		String str = +intTemp+","+countTemp+";";
		return str;
	}
	/**
	 * 根据图片像素的宽度、高度、二维游标编码获得相片的像素颜色值数组
	 * @param rlcStr
	 * @param tileWidth
	 * @param tileHeight
	 * @return
	 */
	public String [][] getImagePixelByRunLengthCoding(String rlcStr,int tileWidth,int tileHeight) {
		rlcStr = "1,7;0,37;1,9;0,18;1,9;1,7;0,37;1,3;0,1;1,5;0,19;1,8;1,7;0,37;1,2;0,3;1,4;0,20;1,7;1,5;0,67;1,8;1,3;0,70;1,7;1,2;0,60;4,1;0,10;1,7;1,2;0,71;1,7;1,1;0,72;1,7;1,1;0,60;4,1;0,11;1,7;0,15;2,2;0,55;1,8;0,15;2,3;0,54;1,8;0,13;2,5;0,54;1,8;0,12;2,8;0,52;1,8;0,13;2,7;0,52;1,8;1,1;0,13;2,4;0,54;1,8;1,1;0,14;2,2;0,55;1,8;1,1;0,70;1,9;1,2;0,69;1,9;1,3;0,67;1,10;1,4;0,67;1,9;1,5;0,67;1,8;1,6;0,53;4,1;0,11;1,9;1,6;0,64;1,10;1,6;0,20;1,2;0,41;1,11;1,6;0,20;1,2;0,31;4,1;0,9;1,11;1,6;0,20;1,2;0,20;1,1;0,20;1,11;1,5;0,21;1,2;0,20;1,1;0,20;1,11;1,2;0,46;1,1;0,20;1,11;1,1;0,68;1,11;0,69;1,11;0,70;1,10;0,70;1,10;0,71;1,9;0,71;1,9;0,38;3,1;0,33;1,8;0,37;3,3;0,33;1,7;0,36;3,5;0,32;1,7;0,33;3,1;0,2;3,6;0,31;1,7;0,36;3,5;0,32;1,7;0,37;3,4;0,32;1,7;0,38;3,2;0,19;4,1;0,12;1,8;0,38;3,1;0,33;1,8;0,72;1,8;0,71;1,9;1,1;0,69;1,10;1,2;0,67;1,11;1,5;0,64;1,11;1,6;0,53;4,1;0,9;1,11;1,6;0,20;1,3;0,40;1,11;1,6;0,20;1,3;0,40;1,11;1,6;0,20;1,3;0,41;1,10;1,6;0,20;1,3;0,42;1,9;1,6;0,66;1,8;1,6;0,53;4,1;0,13;1,7;1,5;0,68;1,7;1,4;0,69;1,7;1,3;0,70;1,7;1,3;0,70;1,7;1,2;0,71;1,7;1,1;0,58;4,1;0,13;1,7;1,1;0,57;4,3;0,12;1,7;1,1;0,55;4,6;0,11;1,7;1,1;0,55;4,7;0,10;1,7;1,1;0,56;4,5;0,11;1,7;1,2;0,56;4,3;0,12;1,7;1,2;0,57;4,1;0,12;1,8;1,2;0,57;4,1;0,12;1,8;1,3;0,68;1,9;1,4;0,67;1,9;1,5;0,65;1,10;1,6;0,63;1,11;1,6;0,63;1,11;1,6;0,20;1,3;0,40;1,11;1,6;0,20;1,3;0,40;1,11;1,6;0,20;1,4;0,18;1,1;0,20;1,11;1,6;0,20;1,4;0,18;1,2;0,19;1,11;1,7;0,19;1,5;0,16;1,3;0,18;1,12;1,7;0,18;1,6;0,16;1,3;0,18;1,12;1,7;0,18;1,7;0,14;1,5;0,16;1,13;1,8;0,16;1,10;0,10;1,7;0,16;1,13";
		String [] arrRunLengthCoding = rlcStr.split(";");
		String [][] arrImagePixel2 = new String[tileWidth][tileHeight];
		int xTemp = 0;
		int yTemp = 0;
		for (int i = 0; i < arrRunLengthCoding.length; i++) {
			if (xTemp == tileWidth) {
				xTemp = 0;
				yTemp = yTemp + 1;
			}
			String arrTemp[] = arrRunLengthCoding[i].split(",");
			int a1 = Integer.valueOf(arrTemp[0]);
			int a2 = Integer.valueOf(arrTemp[1]);
			
			String color = getImagePixelColorByInt(a1);
			for (int j = 0; j < a2; j++) {
				arrImagePixel2[yTemp][xTemp + j] = color;
				System.out.println("["+yTemp+","+(xTemp + j)+"]=="+color);
			}
			xTemp = xTemp + a2;
		}
		return arrImagePixel2;
	}
}


  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值