C语言经典的无损压缩算法有:哈夫曼算法、LZ。
哈夫曼算法:
哈夫曼编码是David A. Huffman于1952年发明的一种满足对编码算法要求的一种编码算法。
哈夫曼算法是利用频率信息构造一棵二叉树,频率高的离根节点近(编码长度短),频率低的离根节点远(编码长度长),手动构造方法是先将字母按照频率从小到大排序,然后不断选择当前还没有父节点的节点中权值最小的两个,构造新的父节点,父节点的值为这两个节点值的和,直到构造成一棵二叉树。
LZ算法:
LZ算法及其衍生变形算法是压缩算法的一个系列。LZ77和LZ78算法分别在1977年和1978年被创造出来。虽然他们名字差不多,但是算法方法完全不同。这一系列算法主要适用于字母数量有限的信息,比如文字、源码等。流行的GIF和PNG格式的图像,使用颜色数量有限的颜色空间,其压缩就采用了两种算法的灵活变形应用。
② 求用C语言写的图像压缩(JPEG)编码中zigzag编程部分
你说的是这段?
还是包括后面的huffman编码部分
static UChar zigzag[64]={ 0, 1, 5, 6,14,15,27,28,
2, 4, 7,13,16,26,29,42,
3, 8,12,17,25,30,41,43,
9,11,18,24,31,40,44,53,
10,19,23,32,39,45,52,54,
20,22,33,38,46,51,55,60,
21,34,37,47,50,56,59,61,
35,36,48,49,57,58,62,63 };
//zigzag reorder
for (i=0;i<=63;i++) DU[zigzag[i]]=DU_DCT[i];
③ 6涓鍏嶈垂宸ュ叿鍦ㄧ嚎铡嬬缉锲剧墖
6涓鍏嶈垂宸ュ叿鍦ㄧ嚎铡嬬缉锲剧墖
杞绘涧铡嬬缉锲剧墖鏂囦欢澶у皬
Pic diet
Pic diet鏄涓娆惧湪绾挎壒閲忓帇缂╁浘鐗囩炲櫒銆
瀹gО浠呴氲繃浣犵殑娴忚埚櫒𨱒ュ帇缂╁浘鐗囧ぇ灏忥纴杩欐剰锻崇潃瀹冨帇缂╁浘鐗囨瀬蹇骞朵笖涓崭细瀵艰嚧闅愮佹垨鏁忔劅锲剧墖娉勬纺缁欑涓夋柟銆
鏀鎸佺殑锲剧墖镙煎纺锛歫pg锛 jpeg锛 镞犲浘镀忓昂瀵搁檺鍒躲傛棤鏂囦欢澶у皬闄愬埗锛屾棤锲惧儚鏁伴噺闄愬埗銆
瀹屽叏鍏嶈垂锛岃缮鍙浠ヤ换镒忚皟鏁村浘镀忕殑杈揿嚭璐ㄩ噺
Tiny PNG
Tiny PNG浣跨敤鏅鸿兘链夋崯铡嬬缉鎶链𨱒ュ噺灏忓浘鐗囨枃浠剁殑澶у皬銆
鏀鎸乄EB P锛 JPEG鍜孭NG镙煎纺銆
Tiny PNG镄勫师鐞嗘槸灏哖NG 24浣岖湡褰╄壊锲剧墖铡嬬缉鎴怭NG 8浣岖储寮曞浘鐗囷纴 浠庤屽仛鍒板熀链涓嶆崯澶辩敾璐ㄥ拰瑙傛劅
鍏嶈垂鐗堟渶澶氭敮鎸20寮犲浘鐗囷纴姣忓紶锲剧墖链澶5MB
doc small
doc small鏄鍦ㄧ嚎鏂囦欢澶勭悊宸ュ叿锛 镞犻渶涓嬭浇杞浠讹纴阃氲繃浜戠链嶅姟鍙闇瑕佷笂浼犮佸勭悊銆佷笅杞界亩鍗曚笁姝ュ嵆鍙瀹屾垚镎崭綔锛 鐩鍓嶆湁锲剧墖铡嬬缉銆丢IF铡嬬缉銆丳DF铡嬬缉銆丳DF钖埚苟銆丳DF鍒嗗壊锷熻兘
锲剧墖铡嬬缉锛 鏀鎸丳NG鍜孞PG镙煎纺
链澶氢竴娆℃30寮犵収鐗囷纴链澶25MB
EZ GIF
涓涓寮哄ぇ镄勫湪绾縂IF鍒朵綔鍣ㄥ拰宸ュ叿闆嗭纴 杩桦彲浠ョ敤浜庡熀链镄勫姩鐢籊IF缂栬緫銆傚彲浠ュ垱寤猴纴 璋冩暣澶у皬锛岃佸壀锛 鍙嶈浆锛 浼桦寲鍜屽簲鐢ㄤ竴浜涙晥鏋滃埌GIF
杩桦寘𨰾瑙嗛戣浆鎴愬姩锲撅纴锷ㄥ浘杞鎴愯嗛戯纴锷熻兘闱炲父寮哄ぇ銆
鍙浠ュ緢濂界殑铡嬬缉gif锲剧墖镄勫ぇ灏
Re compressor 浣犲彧闇阃夊彇涓骞呮垨澶氩箙锲惧儚锛屼氦缁橰e compressor澶勭悊銆备细灏濊瘯澶氱嶉吨鏂板帇缂╋纴 浠ョ敓鎴愭枃浠跺昂瀵稿拰璐ㄩ噺镄勫规瘆锲撅纴骞朵笖鍙銮峰彇瀹屾暣鍦ㄧ嚎棰勮
镆ョ湅瀹屾暣镄勭粨鏋滈勮堬纴浠绘剰涓嬭浇鎭ㄥ枩娆㈢殑缁撴灉锛屽叏閮ㄥ厤璐广傛棤骞垮憡銆傛棤闇娉ㄥ唽锏诲綍鍗冲彲浣跨敤
Optimi zilla
Optimi zilla鍦ㄧ嚎锲惧儚浼桦寲鍣ㄤ娇鐢ㄤ紭鍖栧拰铡嬬缉绠楁硶𨱒ヨ揪鍒版渶灏忓昂瀵哥殑JPEG銆丢IF鍜孭NG锲惧儚锛 钖屾椂淇濊瘉浼樼镄勫浘镀忓帇缂╂瘆銆
鏀鎸佷笂浼犲氲揪20寮犲浘镀忋傜瓑寰呭帇缂╁畬鎴愩
鍗曞嚮绛夊緟浠诲姟涓镄勭缉鐣ュ浘瀹炵幇璐ㄩ噺璁剧疆銆备娇鐢ㄦ粴锷ㄦ浔𨱒ヨ剧疆铡嬬缉绾у埆鍜岄紶镙/镓嫔娍𨱒ユ瘆杈冨浘镀忋
④ VC++得到图像数据太大,想要压缩后再传输
下载一个CxImage(开源),用它来压缩成jpg或其它格式再传。
也可以使用ijl。
下面是我写的使用CxImage的例子:
#include "xImage.h"
#include "CaptureScreen.h"
#pragma comment(lib,"cximage.lib")
#pragma comment(lib,"jpeg.lib")
#pragma comment(lib,"jasper.lib")
CAPTURESCREEN_API bool __stdcall Capture(char* lpszFile,unsigned int height,unsigned int width,unsigned char jpgQuality)
{
keybd_event(VK_SNAPSHOT,0,0,0);
keybd_event(VK_SNAPSHOT,0,KEYEVENTF_KEYUP,0);
if(!IsClipboardFormatAvailable(CF_DIB))return false;
HANDLE hBitmap = NULL;
if( OpenClipboard( NULL ))
{
hBitmap = GetClipboardData(CF_DIB);
CloseClipboard();
}
if( hBitmap == NULL )return false;
CxImage image;
if( image.CreateFromHANDLE(hBitmap) == false )return false;
image.Resample(width,height,1);
image.SetJpegQuality(jpgQuality);
image.Save(lpszFile,CXIMAGE_FORMAT_JPG);
return true;
}