2010-11-23 31 views
1

後,這是我的計劃的一部分:JPG圖像從30KB變爲300KB cvCreateImageHeader

// let's get jpg image from socket 
int iRcvdBytes=recvfrom(iSockFd, buff, bufferSize, 0, 
(struct sockaddr*)&cliAddr, (socklen_t*)&cliAddrLen); 

// buff now contains 30KB jpg image 

// let's load the jpg image to IplImage 
IplImage* fIplImageHeader; 
fIplImageHeader = cvCreateImageHeader(cvSize(640, 480), 8, 1); 
fIplImageHeader->imageData = (char *)buff; 

// now let's check the size difference 
cout << "Received " << iRcvdBytes << " bytes from the client" << endl; 
cout << fIplImageHeader->imageSize << endl; 

,輸出是:

Received 31860 bytes from the client 
307200 

現在這是爲什麼? cvCreateImageHeader()將jpg圖像轉換爲RGB或類似的內部?我希望它保持JPG並用cvShowImage()顯示它。

請任何幫助,歡迎。

回答

2

您正在比較壓縮的jpeg圖像數據的長度與未壓縮的像素數據。

尤其是,鑑於:

fIplImageHeader = cvCreateImageHeader(cvSize(width, height), depth, channels) 

這將永遠是fIplImageHeader->imageSize == width * height * (depth/8) * channels

分配由recvfrom()調用imageData區收到的字節在第一不工作的情況下地點。

+0

是的。但我想從緩衝區加載JPG而不解壓縮。 – 2010-11-23 23:33:44

1

Jpeg不代表圖像的確切表示。這是一種「有損」的格式(即,您失去了一些細節以換取較小尺寸的圖像)。我敢打賭你沒有指定你想要的圖像的'質量',因此它使用默認的高質量。查找質量設置並將其設置爲較低的值。您需要平衡圖像質量與文件大小以適合您的應用程序。