當前位置:首頁 » 編程語言 » jpeg解碼c語言
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

jpeg解碼c語言

發布時間: 2022-01-12 13:56:15

1. 求JPEG格式的詳細介紹。以及JPEG圖像DC系數提取的c語言實現代碼

JPEG格式

JPEG也是常見的一種圖像格式,它由聯合照片專家組(Joint Photographic Experts Group)開發並以命名為%26quot;ISO 10918-1%26quot;,JPEG僅僅是一種俗稱而已。JPEG文件的擴展名為.jpg或.jpeg,其壓縮技術十分先進,它用有損壓縮方式去除冗餘的圖像和彩色數據,獲取得極高的壓縮率的同時能展現十分豐富生動的圖像,換句話說,就是可以用最少的磁碟空間得到較好的圖像質量。

同時JPEG還是一種很靈活的格式,具有調節圖像質量的功能,允許你用不同的壓縮比例對這種文件壓縮,比如我們最高可以把1.37MB的BMP點陣圖文件壓縮至20.3KB。當然我們完全可以在圖像質量和文件尺寸之間找到平衡點。

由於JPEG優異的品質和傑出的表現,它的應用也非常廣泛,特別是在網路和光碟讀物上,肯定都能找到它的影子。目前各類瀏覽器均支持JPEG這種圖像格式,因為JPEG格式的文件尺寸較小,下載速度快,使得Web頁有可能以較短的下載時間提供大量美觀的圖像,JPEG同時也就順理成章地成為網路上最受歡迎的圖像格式。

四、JPEG2000格式

JPEG 2000同樣是由JPEG 組織負責制定的,它有一個正式名稱叫做%26quot;ISO 15444%26quot;,與JPEG相比,它具備更高壓縮率以及更多新功能的新一代靜態影像壓縮技術。

JPEG2000 作為JPEG的升級版,其壓縮率比JPEG高約30%左右。與JPEG不同的是,JPEG2000 同時支持有損和無損壓縮,而 JPEG 只能支持有損壓縮。無損壓縮對保存一些重要圖片是十分有用的。JPEG2000的一個極其重要的特徵在於它能實現漸進傳輸,這一點與GIF的%26quot;漸顯%26quot;有異曲同工之妙,即先傳輸圖像的輪廓,然後逐步傳輸數據,不斷提高圖像質量,讓圖象由朦朧到清晰顯示,而不必是像現在的 JPEG 一樣,由上到下慢慢顯示。

此外,JPEG2000還支持所謂的%26quot;感興趣區域%26quot;特性,你可以任意指定影像上你感興趣區域的壓縮質量,還可以選擇指定的部份先解壓縮。 JPEG 2000 和 JPEG 相比優勢明顯,且向下兼容,因此取代傳統的JPEG格式指日可待。

JPEG2000可應用於傳統的JPEG市場,如掃描儀、數碼相機等,亦可應用於新興領域,如網路傳輸、無線通訊等等。
-------
JPEG(Joint Photographic Experts Group) 是一個由 ISO和IEC兩個組織機構聯合組成的一個專家組,負責制定靜態的數字圖像數據壓縮編碼標准,這個專家組開發的演算法稱為JPEG演算法,並且成為國際上通用的標准,因此又稱為JPEG標准。JPEG是一個適用范圍很廣的靜態圖像數據壓縮標准,既可用於灰度圖像又可用於彩色圖像。

JPEG專家組開發了兩種基本的壓縮演算法,一種是採用以離散餘弦變換(Discrete Cosine Transform,DCT)為基礎的有損壓縮演算法,另一種是採用以預測技術為基礎的無損壓縮演算法。使用有損壓縮演算法時,在壓縮比為25:1的情況下,壓縮後還原得到的圖像與原始圖像相比較,非圖像專家難於找出它們之間的區別,因此得到了廣泛的應用。例如,在V-CD和DVD-Video電視圖像壓縮技術中,就使用JPEG的有損壓縮演算法來取消空間方向上的冗餘數據。為了在保證圖像質量的前提下進一步提高壓縮比,近年來JPEG專家組正在制定JPEG 2000(簡稱JP 2000)標准,這個標准中將採用小波變換(wavelet)演算法。

JPEG壓縮是有損壓縮,它利用了人的視角系統的特性,使用量化和無損壓縮編碼相結合來去掉視角的冗餘信息和數據本身的冗餘信息。壓縮編碼大致分成三個步驟:

1.使用正向離散餘弦變換(forward discrete cosine transform,FDCT)把空間域表示的圖變換成頻率域表示的圖。

2.使用加權函數對DCT系數進行量化,這個加權函數對於人的視覺系統是最佳的。

3.使用霍夫曼可變字長編碼器對量化系數進行編碼。

解碼或者叫做解壓縮的過程與壓縮編碼過程正好相反。

JPEG演算法與彩色空間無關,因此「RGB到YUV變換」和「YUV到RGB變換」不包含在JPEG演算法中。JPEG演算法處理的彩色圖像是單獨的彩色分量圖像,因此它可以壓縮來自不同彩色空間的數據,如RGB, YCbCr和CMYK。

JPEG壓縮編碼演算法的主要計算步驟如下:

1.正向離散餘弦變換(FDCT)。

2.量化(quantization)。

3.Z字形編碼(zigzag scan)。

4.使用差分脈沖編碼調制(differential pulse code molation,DPCM)對直流系數(DC)進行編碼。

5.使用行程長度編碼(run-length encoding,RLE)對交流系數(AC)進行編碼。

6.熵編碼(entropy coding)。

2. 量化

量化是對經過FDCT變換後的頻率系數進行量化。量化的目的是減小非「0」系數的幅度以及增加「0」值系數的數目。量化是圖像質量下降的最主要原因。

對於有損壓縮演算法,JPEG演算法使用均勻量化器進行量化,量化步距是按照系數所在的位置和每種顏色分量的色調值來確定。因為人眼對亮度信號比對色差信號更敏感,因此使用了兩種量化表:亮度量化值和色差量化值。此外,由於人眼對低頻分量的圖像比對高頻分量的圖像更敏感,因此圖中的左上角的量化步距要比右下角的量化步距小。

3. Z字形編排

量化後的系數要重新編排,目的是為了增加連續的「0」系數的個數,就是「0」的遊程長度,方法是按照Z字形的式樣編排,如圖5-17所示。這樣就把一個8 ? 8的矩陣變成一個1 ? 64的矢量,頻率較低的系數放在矢量的頂部。

4. 直流系數的編碼

8 ? 8圖像塊經過DCT變換之後得到的DC直流系數有兩個特點,一是系數的數值比較大,二是相鄰8 ? 8圖像塊的DC系數值變化不大。根據這個特點,JPEG演算法使用了差分脈沖調制編碼(DPCM)技術,對相鄰圖像塊之間量化DC系數的差值(Delta)進行編碼,

Delta=DC(0, 0)k-DC(0, 0)k-1 ........ (5-5)

5. 交流系數的編碼

量化AC系數的特點是1 ? 64矢量中包含有許多「0」系數,並且許多「0」是連續的,因此使用非常簡單和直觀的遊程長度編碼(RLE)對它們進行編碼。

JPEG使用了1個位元組的高4位來表示連續「0」的個數,而使用它的低4位來表示編碼下一個非「0」系數所需要的位數,跟在它後面的是量化AC系數的數值。

6. 熵編碼

使用熵編碼還可以對DPCM編碼後的直流DC系數和RLE編碼後的交流AC系數作進一步的壓縮。

在JPEG有損壓縮演算法中,使用霍夫曼編碼器來減少熵。使用霍夫曼編碼器的理由是可以使用很簡單的查表(lookup table)方法進行編碼。壓縮數據符號時,霍夫曼編碼器對出現頻度比較高的符號分配比較短的代碼,而對出現頻度較低的符號分配比較長的代碼。這種可變長度的霍夫曼碼表可以事先進行定義。

2. C++編程 我在網上下載了一個C++的程序,是JPEG解碼的

這是命令提示符下做輸入參數的。argv 是命令字元串,argc 是命令數;
要讀取什麼文件名,取決於你輸入的文件名。

你可以到網上看一下關於C有參數的程序的東西。

3. 如何使用C語言實現JPEG圖像格式的讀取與寫入

你用的開發編程工具是什麼?在VS.NET
2005下提供CImage類,可以載入、顯示和保存各種不同的圖像格式,包括
.bmp、.gif、.jpg

.png。

4. jpeg編解碼c語言實現怎麼執行

#include <<a href="https://www..com/s?wd=stdlib.h&tn=44039180_cpr&fenlei=-bIi4WUvYETgN-TLwGUv3EPHf3PHT4P1md" target="_blank" class="-highlight">stdlib.h</a>>
#include <<a href="https://www..com/s?wd=stdio.h&tn=44039180_cpr&fenlei=-bIi4WUvYETgN-TLwGUv3EPHf3PHT4P1md" target="_blank" class="-highlight">stdio.h</a>>
int main ()
{
FILE * fpPhoto, * fpText, * fpTarget ;
int iRead ;
char szBuf[100] ;

printf ("請輸入第一個文件名(bmp):\n") ;
gets (szBuf) ;
fpPhoto = fopen (szBuf, "rb") ;
printf ("請輸入第二個文件名(txt):\n") ;
gets (szBuf) ;
fpText = fopen (szBuf, "rb") ;
printf ("請輸入目的文件名(bmp):\n") ;
gets (szBuf) ;
fpTarget = fopen (szBuf, "wb") ;

if (!fpPhoto || !fpText || !fpTarget)
{
printf ("打開文件失敗!\n") ;
system("pause") ;
return -1 ;
}

while ((iRead = fread (szBuf, 1, sizeof (szBuf), fpPhoto)) > 0)
fwrite (szBuf, 1, iRead, fpTarget) ;
while ((iRead = fread (szBuf, 1, sizeof (szBuf), fpText)) > 0)
fwrite (szBuf, 1, iRead, fpTarget) ;

fclose (fpPhoto) ;
fclose (fpText) ;
fclose (fpTarget) ;
return 0 ;
}

5. 用c語言如何讀取和保存jpg圖片文件

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int file_size(char* filename)//獲取文件名為filename的文件大小。

{

FILE *fp = fopen(filename, "rb");//打開文件。

int size;

if(fp == NULL) // 打開文件失敗

return -1;

fseek(fp, 0, SEEK_END);//定位文件指針到文件尾。

size=ftell(fp);//獲取文件指針偏移量,即文件大小。

fclose(fp);//關閉文件。

return size;

}

int main ()

{

int size=0;

size=file_size("qw");

printf("%d ",size);

FILE * pFile,*qw;

char *buffer=(char*)malloc(sizeof(char)*size);

qw =fopen("qw","r");

pFile = fopen ( "qwe" , "wb" );

printf("%d== ",pFile);

printf("%d ",size);

fread(buffer,1,size,qw);

fwrite (buffer , sizeof(byte), size , pFile );

fclose (pFile);

rename("qwe","Groot.jpg");

return 0;

}

(5)jpeg解碼c語言擴展閱讀:

c語言讀取TXT文件:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define MAX_LINE 1024

int main()

{

char buf[MAX_LINE]; /*緩沖區*/

FILE *fp; /*文件指針*/

int len; /*行字元個數*/

if((fp = fopen("test.txt","r")) == NULL)

{

perror("fail to read");

exit (1) ;

}

while(fgets(buf,MAX_LINE,fp) != NULL)

{

len = strlen(buf);

buf[len-1] = ''; /*去掉換行符*/

printf("%s %d ",buf,len - 1);

}

return 0;

}




6. 怎樣用C語言得到jpeg格式或BMP格式的圖像的像素的rgb值

原型:
int WINAPI icePub_getImgfilePColor(char *strImgFilename,int x,int y,char *strR,char *strG,char *strB,int flag)
輸入:strImgFilename 待處理的圖片文件名
x x坐標
y y坐標
flag 輸出RGB值的格式,0 10進制,1 16進制
輸出:strR R值
strG G值
strB B值
返回碼:0 OK;-2 x,y值超出圖片長寬

int retCode=-1;
char strR[128],strG[128],strB[128];
Cstring m_mem;

typedef int (WINAPI ICEPUB_GETIMGFILEPCOLOR)(char *strImgFilename,int x,int y,char *strR,char *strG,char *strB,int flag);
ICEPUB_GETIMGFILEPCOLOR *icePub_getImgfilePColor = 0;
HINSTANCE hDLLDrv = LoadLibrary("icePubDll.dll");
if(hDLLDrv)
icePub_getImgfilePColor = (ICEPUB_GETIMGFILEPCOLOR *)GetProcAddress(hDLLDrv, "icePub_getImgfilePColor");
if(icePub_getImgfilePColor)
retCode=icePub_getImgfilePColor("a.jpg",100,55,strR,strG,strB,0);
if(hDLLDrv)
FreeLibrary(hDLLDrv);
if(retCode == 0)
m_mem.Format("(x,y):%d,%d\r\nR:%s\r\nG:%s\r\nB:%s",point.x,point.y,strR,strG,strB);
AfxMessageBox(m_mem);

原型:
int WINAPI icePub_imgToFileTextdata(char *strImgFilename,char *strFilename,char *strFenge,int flag)
輸入:strImgFilename 待處理圖像文件 (會被強制256級灰度化)
strFilename 待生成BMP文本數據文件名
strFenge 列之間分隔符
flag 文本數據格式標志:0 10進制; 1 16進制; 10 RGB16進制
輸出:

extern "C"
{
__declspec(dllexport)
int WINAPI icePub_imgToFileTextdata(char *strImgFilename,char *strFilename,char *strFenge,int flag);
}

#pragma comment(lib,"icePubDll.lib")

icePub_imgToFileTextdata("a.jpg","bmpdata.txt",",",0);

原型:
char * WINAPI icePub_getBufferFromImg2(char *strImgFilename,int *width,int *height,int huiGrade)
輸入:strImgFilename 圖片文件名
huiGrade 圖像灰度化標志,0 no; >1 and <=256 灰度級
輸出:width 圖像寬度
height 圖像高度
返回值:圖像的點陣數據(按照24位BMP格式)

extern "C"
{
__declspec(dllexport)
char * WINAPI icePub_getBufferFromImg2(char *strImgFilename,int *width,int *height,int huiGrade);
}

#pragma comment(lib,"icePubDll.lib")

char *bmpBuffer=NULL;
int imgWidth, imgHeight;

bmpBuffer = icePub_getBufferFromImg2 ("e:\\a.jpg",&imgWidth,&imgHeight,0);
//然後對bmpBuffer數據處理即可

if(bmpBuffer != NULL)
free(bmpBuffer);

7. 如何將JPEG解碼的C語言程序移植到DSP中去

如果全是c語言代碼,一般直接移植過去就可以幹活,只是內存在DSP上比PC上可能會有一些限制。還有就是要重新設計DSP的(圖象)數據的輸入和輸出。
然後如果對解碼效率如果不滿意,則需要參照該款DSP提供的演算法庫(一般DSP供應商都會提供針對該款DSP優化的演算法庫)的文檔將一些頻繁使用的演算法替換成調用這些演算法庫的程序,這個就是移植了,參照演算法庫時也需要根據演算法庫的要求安排數據在DSP存儲區中的存放位置(片內/片外)。
再有就是進一步提高效率,利用DSP的特殊設備比如DMA、一二級高速緩存、特殊指令、高速片內存儲器等等繼續優化演算法。

8. 求 純C語言 jpeg解碼器 源代碼 JPEGDEC

在我的文庫里有啊。

9. 求C語言的JPG讀寫的源程序

去www.codeproject.com ,有個開源庫叫 CxImage

10. 為什麼C語言不能直接讀取jpeg圖像文件

可以直接讀取的
按照二進制文件 也就是"rb"方式打開就可以了
不過 讀取後,這個是亂的,沒法直接顯示。
需要自己寫解碼程序,或者調用對應jpeg庫

轉成bitmap才可以顯示的。