この関数を指定されたファイル名 (jpeg ファイル) に書き、そのサイズを w と h のピクセル単位で出力します。私が読んでいるチュートリアルによると、
//0xFFC0 は、ファイル サイズを含む「フレームの開始」マーカーです //0xFFC0 ブロックの構造は非常に単純です [0xFFC0][ushort length][uchar precision][ushort x][ushort y]
だから、私はこれを書いたstruct
#pragma pack(1)
struct imagesize {
unsigned short len; /* 2-bytes */
unsigned char c; /* 1-byte */
unsigned short x; /* 2-bytes */
unsigned short y; /* 2-bytes */
}; //sizeof(struct imagesize) == 7
#pragma pack()
その後:
#define SOF 0xC0 /* start of frame */
void jpeg_test(const char *filename)
{
FILE *fh;
unsigned char buf[4];
unsigned char b;
fh = fopen(filename, "rb");
if(fh == NULL)
fprintf(stderr, "cannot open '%s' file\n", filename);
while(!feof(fh)) {
b = fgetc(fh);
if(b == SOF) {
struct imagesize img;
#if 1
ungetc(b, fh);
fread(&img, 1, sizeof(struct imagesize), fh);
#else
fread(buf, 1, sizeof(buf), fh);
int w = (buf[0] << 8) + buf[1];
int h = (buf[2] << 8) + buf[3];
img.x = w;
img.y = h;
#endif
printf("%dx%d\n",
img.x,
img.y);
break;
}
}
fclose(fh);
}
しかし、私はの520x537
代わりに取得700x537
しています。それが実際のサイズです。
誰かが私が間違っている場所を指摘して説明できますか?