如何找到JPG文件的帧图像开始(SOFO)段所在位置

sxqvb 2018-01-09 10:03:12
我知道帧图像开始(SOFO)的标记码是0xFFC0,我是从文件开始就开始找,但是找到了很多个,不知到那个才是SOFO所在的位置
...全文
753 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2018-02-05
  • 打赏
  • 举报
回复
JPG FFD8 开始 中间每个块以 FFXX 开头,紧接着是以大端保存的 2 字节 (unsigned short) 指明该块的大小,块大小包含储存块大小的这个 2 字节在内。 FFD9 结束 不需要关心多余的文件头细节,自己随便分析分析,找到所需的块,很简单。
「已注销」 2018-02-05
  • 打赏
  • 举报
回复
#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;
}
「已注销」 2018-02-03
  • 打赏
  • 举报
回复
话说,不知道搜索 JPEG 的文件格式吗? https://en.wikipedia.org/wiki/JPEG_File_Interchange_Format
百灵工作室 2018-01-11
  • 打赏
  • 举报
回复
每个jpeg文件,文件和文件都不一样,是有差异的,譬如有的有exif信息,有的没有,还有的附加了其他信息在里面,所以,你要按照tag和规范去偏移,


worldy 2018-01-11
  • 打赏
  • 举报
回复
这博文解释的很详细 http://blog.csdn.net/ryfdizuo/article/details/41250775
赵4老师 2018-01-10
  • 打赏
  • 举报
回复
参考开源软件Image Magick

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧