我知道幀影像開始(SOFO)的標記碼是0xFFC0,我是從檔案開始就開始找,但是找到了很多個,不知到那個才是SOFO所在的位置
uj5u.com熱心網友回復:
參考開源軟體Image Magickuj5u.com熱心網友回復:
這博文解釋的很詳細http://blog.csdn.net/ryfdizuo/article/details/41250775
uj5u.com熱心網友回復:
每個jpeg檔案,檔案和檔案都不一樣,是有差異的,譬如有的有exif資訊,有的沒有,還有的附加了其他資訊在里面,所以,你要按照tag和規范去偏移,
uj5u.com熱心網友回復:
話說,不知道搜索 JPEG 的檔案格式嗎?https://en.wikipedia.org/wiki/JPEG_File_Interchange_Format
uj5u.com熱心網友回復:
#include <stdio.h>
#include <stdlib.h>
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <shellapi.h>
#include <shlwapi.h>
// 0xFFD8: SOI
// 0xFFE0: APP0
// 0xFFE1: APP1
// 0xFFE2: APP2
// 0xFFE3: APP3
// 0xFFE4: APP4
// 0xFFE5: APP5
// 0xFFE6: APP6
// 0xFFE7: APP7
// 0xFFE8: APP8
// 0xFFE9: APP9
// 0xFFDB: DQT
// 0xFFC0: SOF0
// 0xFFC4: DHT
// 0xFFDA: SOS
// 0xFFD9: EOI
int main(int argc, char *argv[])
{
HANDLE hFile = CreateFile(TEXT("image.jpg"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE) {
LARGE_INTEGER lli = { 0 };
if (GetFileSizeEx(hFile, &lli)) {
HANDLE hMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
if (hMapping != NULL) {
BYTE *lpFileBuffer = (BYTE *)MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);
if (lpFileBuffer != NULL) {
BYTE *lpStartBuffer = lpFileBuffer;
BYTE *lpEndBuffer = lpFileBuffer + (size_t)lli.QuadPart;
while (lpStartBuffer < lpEndBuffer) {
BYTE b1 = lpStartBuffer[0];
BYTE b2 = lpStartBuffer[1];
BYTE b3 = lpStartBuffer[2];
BYTE b4 = lpStartBuffer[3];
WORD wMark = MAKEWORD(b2, b1);
WORD wSize = MAKEWORD(b4, b3);
size_t uOffset = lpStartBuffer - lpFileBuffer;
lpStartBuffer += sizeof(wSize);
if ((wMark != 0xFFD8) && (wMark != 0xFFD9)) {
lpStartBuffer += wSize;
}
switch (wMark) {
case 0xFFD8:
printf("SOI => from %u\n", uOffset);
break;
case 0xFFE0:
printf("APP0 => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFE1:
printf("APP1 => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFE2:
printf("APP2 => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFE3:
printf("APP3 => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFE4:
printf("APP4 => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFE5:
printf("APP5 => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFE6:
printf("APP6 => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFE7:
printf("APP7 => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFE8:
printf("APP8 => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFE9:
printf("APP9 => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFDB:
printf("DQT => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFC0:
printf("SOF0 => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFC4:
printf("DHT => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFDA:
printf("SOS => from %u, size %u\n", uOffset, wSize);
break;
case 0xFFD9:
printf("EOI => from %u\n", uOffset);
break;
default:
break;
}
}
}
UnmapViewOfFile(lpFileBuffer);
}
CloseHandle(hMapping);
}
CloseHandle(hFile);
}
return 0;
}
uj5u.com熱心網友回復:
JPGFFD8 開始
中間每個塊以 FFXX 開頭,緊接著是以大端保存的 2 位元組 (unsigned short) 指明該塊的大小,塊大小包含儲存塊大小的這個 2 位元組在內。
FFD9 結束
不需要關心多余的檔案頭細節,自己隨便分析分析,找到所需的塊,很簡單。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/75349.html
標籤:圖形處理/算法
