RLE行程长度编码压缩算法
在看emWIN的时候看到一个图片压缩的算法可以有效的对二值图(简单的2中颜色或者更多)进行压缩,压缩的效果可以节省空间而且不丢失信息!
特点
缺点
RLE压缩方式
/*********************************************************************
*
* bm0
*/
static GUI_CONST_STORAGE unsigned char _ac0[] = {
/* RLE: 011 Pixels @ 000,000 */ 11, 0xFF,
/* ABS: 010 Pixels @ 011,000 */ 0, 10, 0xF6, 0xA8, 0x48, 0x1D, 0x11, 0x0E, 0x1E, 0x47, 0x8E, 0xE7,
/* RLE: 021 Pixels @ 021,000 */ 21, 0xFF,
/* ABS: 002 Pixels @ 010,001 */ 0, 2, 0xBF, 0x30,
/* RLE: 008 Pixels @ 012,001 */ 8, 0x00,
/* ABS: 003 Pixels @ 020,001 */ 0, 3, 0x17, 0x97, 0xFE,
/* RLE: 017 Pixels @ 023,001 */ 17, 0xFF,
/* ABS: 003 Pixels @ 008,002 */ 0, 3, 0xFE, 0x91, 0x08,
/* RLE: 011 Pixels @ 011,002 */ 11, 0x00,
/* ABS: 002 Pixels @ 022,002 */ 0, 2, 0x69, 0xF8,
/* RLE: 016 Pixels @ 024,002 */ 16, 0xFF,
/* RLE: 001 Pixels @ 008,003 */ 1, 0x7B,
/* RLE: 005 Pixels @ 009,003 */ 5, 0x00,
/* ABS: 004 Pixels @ 014,003 */ 0, 4, 0x03, 0x0E, 0x0F, 0x06,
/* RLE: 005 Pixels @ 018,003 */ 5, 0x00,
/* ABS: 002 Pixels @ 023,003 */ 0, 2, 0x49, 0xF6,
/* RLE: 014 Pixels @ 025,003 */ 14, 0xFF,
/* ABS: 013 Pixels @ 007,004 */ 0, 13, 0xBE, 0x04, 0x00, 0x00, 0x00, 0x03, 0x60, 0xC2, 0xED, 0xF1, 0xD3, 0x7F, 0x13,
/* RLE: 004 Pixels @ 020,004 */ 4, 0x00,
/* RLE: 001 Pixels @ 024,004 */ 1, 0x85,
/* RLE: 014 Pixels @ 025,004 */ 14, 0xFF,
/* ABS: 006 Pixels @ 007,005 */ 0, 6, 0x4A, 0x00, 0x00, 0x00, 0x06, 0xA2,
/* RLE: 006 Pixels @ 013,005 */ 6, 0xFF,
/* ABS: 007 Pixels @ 019,005 */ 0, 7, 0xCE, 0x21, 0x00, 0x00, 0x00, 0x19, 0xE4,
/* RLE: 012 Pixels @ 026,005 */ 12, 0xFF,
/* ABS: 006 Pixels @ 006,006 */ 0, 6, 0xD4, 0x08, 0x00, 0x00, 0x00, 0x7D,
/* RLE: 008 Pixels @ 012,006 */ 8, 0xFF,
/* ABS: 006 Pixels @ 020,006 */ 0, 6, 0xB8, 0x01, 0x00, 0x00, 0x00, 0x99,
/* RLE: 012 Pixels @ 026,006 */ 12, 0xFF,
/* ABS: 006 Pixels @ 006,007 */ 0, 6, 0x9B, 0x00, 0x00, 0x00, 0x15, 0xE5,
/* RLE: 009 Pixels @ 012,007 */ 9, 0xFF,
/* ABS: 005 Pixels @ 021,007 */ 0, 5, 0x48, 0x00, 0x00, 0x00, 0x5F,
/* RLE: 012 Pixels @ 026,007 */ 12, 0xFF,
/* ABS: 005 Pixels @ 006,008 */ 0, 5, 0x7A, 0x00, 0x00, 0x00, 0x46,
/* RLE: 010 Pixels @ 011,008 */ 10, 0xFF,
/* ABS: 006 Pixels @ 021,008 */ 0, 6, 0x82, 0x00, 0x00, 0x00, 0x3E, 0xFE,
/* RLE: 011 Pixels @ 027,008 */ 11, 0xFF,
/* ABS: 005 Pixels @ 006,009 */ 0, 5, 0x71, 0x00, 0x00, 0x00, 0x56,
/* RLE: 010 Pixels @ 011,009 */ 10, 0xFF,
/* ABS: 006 Pixels @ 021,009 */ 0, 6, 0x93, 0x00, 0x00, 0x00, 0x34, 0xFA,
/* RLE: 011 Pixels @ 027,009 */ 11, 0xFF,
/* ABS: 005 Pixels @ 006,010 */ 0, 5, 0x70, 0x00, 0x00, 0x00, 0x57,
/* RLE: 010 Pixels @ 011,010 */ 10, 0xFF,
/* ABS: 006 Pixels @ 021,010 */ 0, 6, 0x94, 0x00, 0x00, 0x00, 0x33, 0xFA,
/* RLE: 011 Pixels @ 027,010 */ 11, 0xFF,
/* ABS: 005 Pixels @ 006,011 */ 0, 5, 0x71, 0x00, 0x00, 0x00, 0x57,
/* RLE: 010 Pixels @ 011,011 */ 10, 0xFF,
/* ABS: 006 Pixels @ 021,011 */ 0, 6, 0x94, 0x00, 0x00, 0x00, 0x34, 0xFA,
/* RLE: 011 Pixels @ 027,011 */ 11, 0xFF,
/* ABS: 005 Pixels @ 006,012 */ 0, 5, 0x71, 0x00, 0x00, 0x00, 0x57,
/* RLE: 010 Pixels @ 011,012 */ 10, 0xFF,
/* ABS: 006 Pixels @ 021,012 */ 0, 6, 0x94, 0x00, 0x00, 0x00, 0x35, 0xFB,
/* RLE: 008 Pixels @ 027,012 */ 8, 0xFF,
/* ABS: 010 Pixels @ 003,013 */ 0, 10, 0xCF, 0x69, 0x59, 0x26, 0x00, 0x00, 0x00, 0x1D, 0x58, 0x57,
/* RLE: 007 Pixels @ 013,013 */ 7, 0x56,
/* ABS: 009 Pixels @ 020,013 */ 0, 9, 0x5B, 0x32, 0x00, 0x00, 0x00, 0x11, 0x53, 0x5E, 0xAF,
/* RLE: 005 Pixels @ 029,013 */ 5, 0xFF,
/* ABS: 002 Pixels @ 002,014 */ 0, 2, 0xD6, 0x18,
/* RLE: 025 Pixels @ 004,014 */ 25, 0x00,
/* RLE: 001 Pixels @ 029,014 */ 1, 0xA4,
/* RLE: 004 Pixels @ 030,014 */ 4, 0xFF,
/* RLE: 001 Pixels @ 002,015 */ 1, 0x7E,
/* RLE: 026 Pixels @ 003,015 */ 26, 0x00,
/* RLE: 001 Pixels @ 029,015 */ 1, 0x46,
/* RLE: 004 Pixels @ 030,015 */ 4, 0xFF,
/* RLE: 001 Pixels @ 002,016 */ 1, 0x63,
/* RLE: 026 Pixels @ 003,016 */ 26, 0x00,
/* RLE: 001 Pixels @ 029,016 */ 1, 0x34,
/* RLE: 004 Pixels @ 030,016 */ 4, 0xFF,
/* RLE: 001 Pixels @ 002,017 */ 1, 0x64,
/* RLE: 026 Pixels @ 003,017 */ 26, 0x00,
/* RLE: 001 Pixels @ 029,017 */ 1, 0x35,
/* RLE: 004 Pixels @ 030,017 */ 4, 0xFF,
/* RLE: 001 Pixels @ 002,018 */ 1, 0x64,
/* RLE: 026 Pixels @ 003,018 */ 26, 0x00,
/* RLE: 001 Pixels @ 029,018 */ 1, 0x35,
/* RLE: 004 Pixels @ 030,018 */ 4, 0xFF,
/* RLE: 001 Pixels @ 002,019 */ 1, 0x64,
/* RLE: 026 Pixels @ 003,019 */ 26, 0x00,
/* RLE: 001 Pixels @ 029,019 */ 1, 0x35,
/* RLE: 004 Pixels @ 030,019 */ 4, 0xFF,
/* RLE: 001 Pixels @ 002,020 */ 1, 0x64,
/* RLE: 026 Pixels @ 003,020 */ 26, 0x00,
/* RLE: 001 Pixels @ 029,020 */ 1, 0x35,
/* RLE: 004 Pixels @ 030,020 */ 4, 0xFF,
/* RLE: 001 Pixels @ 002,021 */ 1, 0x64,
/* RLE: 026 Pixels @ 003,021 */ 26, 0x00,
/* RLE: 001 Pixels @ 029,021 */ 1, 0x35,
/* RLE: 004 Pixels @ 030,021 */ 4, 0xFF,
/* RLE: 001 Pixels @ 002,022 */ 1, 0x64,
/* RLE: 026 Pixels @ 003,022 */ 26, 0x00,
/* RLE: 001 Pixels @ 029,022 */ 1, 0x35,
/* RLE: 004 Pixels @ 030,022 */ 4, 0xFF,
/* RLE: 001 Pixels @ 002,023 */ 1, 0x64,
/* RLE: 026 Pixels @ 003,023 */ 26, 0x00,
/* RLE: 001 Pixels @ 029,023 */ 1, 0x35,
/* RLE: 004 Pixels @ 030,023 */ 4, 0xFF,
/* RLE: 001 Pixels @ 002,024 */ 1, 0x64,
/* RLE: 026 Pixels @ 003,024 */ 26, 0x00,
/* RLE: 001 Pixels @ 029,024 */ 1, 0x35,
/* RLE: 004 Pixels @ 030,024 */ 4, 0xFF,
/* RLE: 001 Pixels @ 002,025 */ 1, 0x64,
/* RLE: 026 Pixels @ 003,025 */ 26, 0x00,
/* RLE: 001 Pixels @ 029,025 */ 1, 0x35,
/* RLE: 004 Pixels @ 030,025 */ 4, 0xFF,
/* RLE: 001 Pixels @ 002,026 */ 1, 0x64,
/* RLE: 026 Pixels @ 003,026 */ 26, 0x00,
/* RLE: 001 Pixels @ 029,026 */ 1, 0x35,
/* RLE: 004 Pixels @ 030,026 */ 4, 0xFF,
/* RLE: 001 Pixels @ 002,027 */ 1, 0x64,
/* RLE: 026 Pixels @ 003,027 */ 26, 0x00,
/* RLE: 001 Pixels @ 029,027 */ 1, 0x35,
/* RLE: 004 Pixels @ 030,027 */ 4, 0xFF,
/* RLE: 001 Pixels @ 002,028 */ 1, 0x62,
/* RLE: 026 Pixels @ 003,028 */ 26, 0x00,
/* RLE: 001 Pixels @ 029,028 */ 1, 0x34,
/* RLE: 004 Pixels @ 030,028 */ 4, 0xFF,
/* RLE: 001 Pixels @ 002,029 */ 1, 0x6E,
/* RLE: 026 Pixels @ 003,029 */ 26, 0x00,
/* RLE: 001 Pixels @ 029,029 */ 1, 0x3B,
/* RLE: 004 Pixels @ 030,029 */ 4, 0xFF,
/* RLE: 001 Pixels @ 002,030 */ 1, 0xB5,
/* RLE: 026 Pixels @ 003,030 */ 26, 0x00,
/* RLE: 001 Pixels @ 029,030 */ 1, 0x7B,
/* RLE: 005 Pixels @ 030,030 */ 5, 0xFF,
/* ABS: 003 Pixels @ 003,031 */ 0, 3, 0x94, 0x1F, 0x0D,
/* RLE: 020 Pixels @ 006,031 */ 20, 0x0F,
/* ABS: 006 Pixels @ 026,031 */ 0, 6, 0x0D, 0x15, 0x6B, 0xF3, 0xFF, 0xFF,
0
}; // 416 bytes for 1024 pixels GUI_CONST_STORAGE GUI_BITMAP bm0 = {
32, // xSize
32, // ySize
32, // BytesPerLine
GUI_COMPRESS_RLE8, // BitsPerPixel
(unsigned char *)_ac0, // Pointer to picture data
NULL, // Pointer to palette
GUI_DRAW_RLEALPHA
};
方法:
***************************************************************************************************************************************************
1.RLE概述
RLE(Run LengthEncoding行程编码)算法是一个简单高效的无损数据压缩算法,其基本思路是把数据看成一个线性序列,而这些数据序列组织方式分成两种情况:一种是连续的重复数据块,另一种是连续的不重复数据块。对于连续的重复数据快采用的压缩策略是用一个字节(我们称之为数据重数属性)表示数据块重复的次数,然后在这个数据重数属性字节后面存储对应的数据字节本身,例如某一个文件有如下的数据序列AAAAA,在未压缩之前占用5个字节,而如果使用了压缩之后就变成了5A,只占用两个字节,对于连续不重复的数据序列,表示方法和连续的重复数据块序列的表示方法一样,只不过前面的数据重数属性字节的内容为1。一般的这里的数据块取一个字节,这篇文章中数据块都默认为一个字节。为了更形象的说明RLE算法的原理我们给出最原始的RLE算法:
2. 原始RLE方法
给出的数据序列为:A-A-A-A-A-B-B-C-D
未压缩前:A-A-A-A-A-B-B-C-D
(0x41-0x41-0x41-0x41-0x41-0x42-0x42-0x43-0x44)
压缩后:5-A-2-B-1-C-1-D
(0x05-0x41-0x02-0x42-0x01-0x43-0x01-0x44)
从这里我们看到RLE的压缩和解压的算法原理非常简单,实现起来也并不复杂。
在进行压缩时逐个扫描待压缩数据,如果碰到某个字节后有重复的字节则计数器就加1(计数器初始值默认为1,也可设置为0),直到找到一个不重复的字节为止,将当前计数器中的值存入数据重数属性的字节中,将对应的该字节的数据存放在数据字节中,然后计数器置1继续用同样的策略扫描剩下的未压缩文档的数据。这里需要主意的是,数据重数属性的单位是一个字节,故最大值为255,因此对于数据序列的某一个数据重复次数大于255时的数据,当计数器记到255时就必须强制将计数器值和当前数据值写入数据重数属性字节中和数据字节中,然后计数器置1继续扫描,直到到达文件末尾。
由于压缩后的数据格式为:数据重数,数据块值,数据重数,数据块值……,因此解压的算法很简单,就是读出第一个位置上的数据重数字节存放的数据块的个数N,然后将第二个位置上的数据字节存放的数据块向解压缓冲区写N份,然后再读出第三个位置上数据重数字节存放的数据块的个数M,然后将第四个位置上数据字节存放的数据块向解压缓冲区写M份,直到读到压缩数据末尾结束。
代码如下:为了显示更清楚(将数据重数属性字节中的ASCII码值转换成了真实的数值,即本该为0x03的就用0x51表示)
- #include<stdio.h>
- #include<string.h>
- #include<malloc.h>
- #define MAX_SIZE 4096
- /**
- 实现了一个简化版的RLE压缩算法,该算法要求字符重复次数不超过79个(127-48)
- 如果是可打印的,则为78吧~ 因为127的ASCII码对应的字符Del是不可打印的
- */
- void CompressRLE(char* input ,char* output)
- {
- int i,j,k = 0;
- for(i = 0; i < strlen(input); i++)
- {
- //直到找到和当前字符不相等的下个字符为止
- for(j = i;input[j] == input[i];j++)
- ;
- /*存放重复计数*/
- output[k++] = j - i + '0';
- /*存放重复的字符*/
- output[k++] = input[i];
- i = j - 1;
- }
- output[k] = '\0';
- }
- void UnCompressRLE(char* input ,char* output)
- {
- int i,j,count;
- for(i = 0; i < strlen(input);i = i + 2)
- {
- count = 0;/*当前重复字符计数*/
- /*在当前解压字符串后存放原串剩余字符*/
- for( j = strlen(output); count < (input[i]-'0');j++)
- {
- output[j] = input[i+1];
- count ++;
- }
- }
- output[j] = '\0';
- }
- void main()
- {
- char* input = (char*)malloc(MAX_SIZE);
- char* output = (char*)malloc(2*MAX_SIZE);
- char* result = (char*)malloc(MAX_SIZE);
- memset(input,0,MAX_SIZE);
- memset(output,0,2*MAX_SIZE);
- memset(result,0,MAX_SIZE);
- printf("please input a string:\n");
- scanf("%s",input);
- printf("input = %s\n",input);
- CompressRLE(input,output);
- printf("output = %s\n",output);
- UnCompressRLE(output,result);
- printf("result = %s",result);
- }
3.RLE改进一(PCX文件的处理方法)
虽然上述算法实现起来很容易,但是它的一个明显的缺点就是如果要压缩的数据很少有连续重复的数据块,采用上诉压缩算法之后数据量反而会“膨胀”,最坏情况下就是所有的数据都不连续重复,则压缩后的数据量会增大一倍。因此就提出了一种改进的RLE算法。算法思路和原始RLE算法大致相当,对于重复的连续数据块依然采用上述算法,不同的是对于不重复的数据块,不会再在它前面插入标志重复次数的字节了,而是直接将该不重复的数据块写入压缩文件。这样即使原文件所有的数据都不是连续重复出现的,压缩后的文件也不会膨胀。但是这样简单的逻辑显然是不行的,这里的一个问题就是在解压缩的时候,如何判断一个字节是原始数据字节还是数据重数字节标志。为了解决这个问题,我们将数据重数字节的高两位置1,用字节剩下的六位来表示(此时能表示的最大长度为63)数据重数,这样在解压的时候如果遇到的字节高两位不全为1则一定是数据字节,但是这里还有一个问题是,如果遇见的字节的高两位全1是就不能判断是数据重数字节还是数据字节,因此,光处理数据重数属性字节的高位是不行的,实现的办法只能是,在数据压缩的时候如果发现数据的高两位是1只能再在该数据字节前面插入数据重数字节,置其值为1(此时由于高两位作为标记位已经置为1,故这里实际存储的是0XC1)。这样这个改进的RLE算法就完成了,其平均压缩率也比原始RLE算法更高,但是相对的压缩速度就稍微慢了。同样的与原始RLE算法一样也有最大长度问题,处理方法与原始RLE一样。
下面是RLE改进一的形象举例说明:给出的数据序列为:A-A-A-A-A-B-B-C-D
未压缩前:A-A-A-A-A-B-B-C-D
(0x41-0x41-0x41-0x41-0x41-0x42-0x42-0x43-0x44)
压缩后:5-A-2-B-C-D
(0xC5-0x41-0xC2-0x42-0x43-0x44)
该算法的解压算法很简单,就是将读取器指针指向第一个字节,逐个读取每个字节,判断该字节高两位是否全为1,如果是,则表示该字节是数据重数字节,则从该字节后六位读取重复次数N,然后将下一个字节向解压缓冲区写入N份,令读取器加指针加2接着读取下面的字节,如果该字节高两位不全为1,则表明该字节是数据字节,故将该字节直接写入解压缓冲区,并使读取器指针加1接着读取下面的字节,直到读取器指针达到文件末尾为止。
4.RLE改进二
上述优化后的RLE算法,在原始数据普遍大于192(0xC0)的情况下,其优化效果相对于优化前的算法没有明显改善。原因在于,原始的RLE算法和改进后的RLE算法对于连续出现的不重复数据的处理方式都是一个一个处理的,没有把不重复数据作为一个整体进行处理。RLE改进二算法的优化思想就是对连续的不重复数据的处理和连续重复数据的处理统一起来,不论数据是否连续重复,都在之前设置一个数据重数字节,这样在解压的时候就不需要区分是数据重数字节还是原始数据字节了。唯一需要区分的是后面跟的数据类型。区分的方法就是数据重数字节的最高位,如果最高位是1则表示后面跟的是连续重复的数据,如果最高位是0则表示后面跟的是连续不重复的数据。标志字节的低7位存储数值(最大值是127),对于连续重复的数据,这个数字表示需要重复的次数,对于连续不重复数据,这个数字表示连续不重复数据块的长度。需要注意的是,只有重复次数超过2的数据才被认为是连续重复数据,因为如果数据的重复次数是2,压缩后加上标志字节后总的长度没有变化,因此没有必要处理。
下面是该RLE改进二的形象举例说明:给出的数据序列为:A-A-A-A-A-B-B-C-D
未压缩前:A-A-A-A-A-B-B-C-D
(0x41-0x41-0x41-0x41-0x41-0x42-0x42-0x43-0x44)
压缩后:5-A-4-B-B-C-D
该RLE改进二的算法的压缩算法设计如下:扫描指针从数据开始处读取数据,并依次向后扫描各个字节,每向后读取一个字节计数器加1,在扫描的同时比较每个字节是否相同,这样就会有两种情况:一种情况是扫描过程中前三个字节出现的都是连续重复的字节,则将计数器最高位置1,然后继续扫描,直到出现1个不相同的字节,此时令扫描指针回退1个字节,计数器减1,然后将计数器的值写入数据重数字节中,并将当前扫描指针指向字节写到随后的数据字节中。另一种情况是扫描过程中前两个字节就不相同,则将计数器最高位置0,然后接着向后扫描,若在此后的扫描过程中出现连续3个相同的字节,则停止扫描,并令扫描指针回退到初始值,计数器减3,然后将当前计数器的值写入数据重数字节中,并将当前扫描指针指向字节及其后N个字节写到随后的数据字节中。
RLE改进二的解压缩算法很简单,因为压缩后的格式是:数据重数,数据块(组),数据重数,数据块(组)……,因此从头扫描,取出数据重数字节并判断其标志位,若为1,则将接下来的一个字节向解压缓冲区写N份(这里的N是由数据重数字节低七位计算出来的),然后扫描指针加2,接着向后扫描。若为0,则将数据重数字节后面的N个字节都写入解压缓冲区,然后扫描指针加N+1,接着向后扫描。整个解压过程直到扫描指针独到整个数据尾部为止。
5.RLE改进三
以上算法中块数属性占用一个字节,原始RLE算法能表示的最大的数据重数为MAX=255,RLE改进一中由于高两位做了标记位,则能表示的最大数据重数为MAX=63,RLE改进二中由于高一位做了标记位,则能表示的最大数据重数为MAX=127,所以如果某数据块重复次数超过了最大值MAX,则按以上各算法,该连续重数的数据块只能被分割成多个(数据重数,数据块)对来表示,这样就加大了空间的开销。
针对上诉算法中出现的连续重复数据块数超过MAX值的情况,规定如果数据重数字节的值为FF则在其后的一个字节仍为数据重数字节,最终的值为这几个数据重数字节值的和,如果特殊的,某数据块连续重复数正好是MAX值,则在该数据块对应的数据重数字节F后再添加一个数据重数字节置其值为0x00。
RLE行程长度编码压缩算法的更多相关文章
- AC日记——行程长度编码 openjudge 1.7 32
32:行程长度编码 总时间限制: 1000ms 内存限制: 65536kB 描述 在数据压缩中,一个常用的途径是行程长度压缩.对于一个待压缩的字符串而言,我们可以依次记录每个字符及重复的次数.这种 ...
- Huffman 编码压缩算法
前两天发布那个rsync算法后,想看看数据压缩的算法,知道一个经典的压缩算法Huffman算法.相信大家应该听说过 David Huffman 和他的压缩算法—— Huffman Code,一种通过字 ...
- [转载]Huffman编码压缩算法
转自http://coolshell.cn/articles/7459.html 前两天发布那个rsync算法后,想看看数据压缩的算法,知道一个经典的压缩算法Huffman算法.相信大家应该听说过 D ...
- huffman编码压缩算法(转)
参考:http://blog.csdn.net/sunmenggmail/article/details/7598012 笔试时遇到的一道题.
- JPEG编码(一)
JPEG编码介绍. 转自:http://blog.chinaunix.net/uid-20451980-id-1945156.html JPEG(Joint Photographic Experts ...
- 2017计算机学科夏令营上机考试-B编码字符串
B:编码字符串 总时间限制: 1000ms 内存限制: 65536kB 描述 在数据压缩中,一个常用的方法是行程长度编码压缩.对于一个待压缩的字符串,我们可以依次记录每个字符及重复的次数.例如,待 ...
- [LeetCode]1313. 解压缩编码列表
给你一个以行程长度编码压缩的整数列表 nums . 考虑每对相邻的两个元素 [freq, val] = [nums[2i], nums[2i+1]] (其中 i >= 0 ),每一对都表示解压后 ...
- PNG,JPEG,BMP,JIF图片格式详解及其对比
原文地址:http://blog.csdn.net/u012611878/article/details/52215985 图片格式详解 不知道大家有没有注意过网页里,手机里,平板里的图片,事实上,图 ...
- 【转】jpeg文件格式详解
JPEG(Joint Photographic Experts Group)是联合图像专家小组的英文缩写.它由国际电话与电报咨询委员会CCITT(The International Telegraph ...
随机推荐
- .net MVC 中“MvcPager” 插件的简单使用。
.net MVC 中提供了一个分页组件"MvcPager",用起来还算方便,实用性较强. 简单写一下使用方法,如有不足的地方,请各位大大给小弟指正出来. 一.准备工作 使用这个组件 ...
- sqlserver 优化相关
http://www.cnblogs.com/studyzy/archive/2008/11/24/1339772.html http://blog.csdn.net/dba_huangzj/arti ...
- assembly打包实例
1.先在pom.xml文件中添加assembly打包插件 <build> <plugins> <plugin> <groupId>org.apache. ...
- 301跳转:IIS服务器网站整站301永久重定向设置方法(阿里云)
欢迎来到重庆SEO俱乐部:搜索引擎优化学习交流QQ群224306761. 承接:seo优化.网站建设.论坛搭建.博客制作.全网营销 博主可接:百度百家.今日头条.一点资讯等软文发布,有需要请联系PE! ...
- super在构造函数中的运用
package example;//在子类构造对象时,访问子类构造函数时候,父类也运行.//原因是:在子类的构造函数中第一行有一个默认的隐式语句super();/* 构造函数不能覆盖 子类的实例化过程 ...
- php 设置白名单ip
//检查白名单ip private function _checkAllowIp() { $allowIp = ['203.195.156.12']; $ip = $this->getIp(); ...
- win7搭建php7+apache2.4
从事php开发的工作也将近两年的时间了,期间在windows上安装了很多次php+apache+mysql,但一直没有写过一篇属于自己的文章,今天心血来潮准备写一篇,长话短说,开搞!! 我在配置php ...
- Spring MVC如何进行JSON数据的传输与接受
本篇文章写给刚接触SpingMVC的同道中人,虽然笔者本身水平也不高,但聊胜于无吧,希望可以给某些人带来帮助 笔者同时再次说明,运行本例时,需注意一些配置文件和网页脚本的路径,因为笔者的文件路径与读者 ...
- Windows下WordPress搭建博客过程
搭建环境:Win7 + XAMPP5.5 + wordpress4.5.1 官网下载安装包,解压,拷贝到网站根目录(D:\IT\XAMPP5.5\htdocs\),重命名为blog(随意) 创建数据库 ...
- module parameters
Parameter values can be assigned at load time by insmod or modprobe(this can read parameter from con ...