gpt4 book ai didi

c - 任何大于 16x8 或 8x16 的图像尺寸的 JPEG 编码错误

转载 作者:行者123 更新时间:2023-11-30 14:57:07 25 4
gpt4 key购买 nike

目前我正在为大学项目开发​​ jpeg 编码器。图像具有固定大小,编码器使用固定量化和霍夫曼表进行基线处理。首先,我的代码从 SDRAM 读取 32 位 RGBx 值,转换为 YCbCr 颜色空间,将每个 channel 标准化为 0 并写回。然后,它开始对 8x8 block 进行 DCT,并将熵编码数据写入 SDRAM。此过程使用 C 语言完成,然后 Python 代码创建一个包含适当 JFIF 标记和熵编码数据的文件。最后,操作系统默认的jpeg解码器用于通过简单的双击来查看图像。

我的代码适用于 8x8、8x16 和 16x8 图像,但不适用于 16x16 或项目中使用的图像的实际大小。下面您可能会看到 16x16 的示例。

16x16 input image 16x16 输入

16x16 output image 16x16 输出

但是,在 stackoverflow 上,它似乎与我的操作系统的默认解码器不同。下面是它在 macOS 预览应用程序上的外观。

enter image description here

我相信我的问题是由于 JFIF 中的标记或某种算法错误造成的。

如果任何有 jpeg 经验的人可以帮助我,我将非常高兴。

亲切的问候

最佳答案

我写了一个jpeg编解码器。维持在https://github.com/MalcolmMcLean/babyxrc然而,尽管欢迎您查看甚至使用它,但这并不能真正回答您的问题。

JPEG 基于 16x16 色度 block 和 8x8 亮度 block 。因此,软件的初始版本在第一个 16x16 block 之后崩溃也就不足为奇了。这只是一个常规编程错误。如果您无法通过阅读 JEG 规范找到它,请启动编辑器并创建一个平面 32x32 图像。然后查看二进制文件,看看它与您的二进制文件有何不同。

这是我的无子采样的负载扫描

static int loadscanYuv111(JPEGHEADER *hdr, unsigned char *buff, FILE *fp)
{
short lum[64];
short Cb[64];
short Cr[64];
BITSTREAM *bs;
int i;
int ii;
int iii;
int iv;
int diffdc = 0;
int dcb = 0;
int dcr = 0;
int actableY;
int actableCb;
int actableCr;
int dctableY;
int dctableCb;
int dctableCr;
int count = 0;
int target;
int luminance;
int red;
int green;
int blue;

actableY = hdr->useac[0];
actableCb = hdr->useac[1];
actableCr = hdr->useac[2];
dctableY = hdr->usedc[0];
dctableCb = hdr->usedc[1];
dctableCr = hdr->usedc[2];

bs = bitstream(fp);

for(i=0;i<hdr->height;i+=8)
for(ii=0;ii<hdr->width;ii+=8)
{
if(hdr->dri && (count % hdr->dri) == 0 && count > 0 )
{
readmarker(bs);
diffdc = 0;
dcb = 0;
dcr = 0;
}

getblock(lum, hdr->dctable[dctableY], hdr->actable[actableY], bs);
lum[0] += diffdc;
diffdc = lum[0];

for(iv=0;iv<64;iv++)
lum[iv] *= hdr->qttable[hdr->useq[0]][iv];
unzigzag(lum);
idct8x8(lum);

getblock(Cb, hdr->dctable[dctableCb], hdr->actable[actableCb], bs);
Cb[0] += dcb;
dcb = Cb[0];

for(iv=0;iv<64;iv++)
Cb[iv] *= hdr->qttable[hdr->useq[1]][iv];
unzigzag(Cb);
idct8x8(Cb);

getblock(Cr, hdr->dctable[dctableCr], hdr->actable[actableCr], bs);
Cr[0] += dcr;
dcr = Cr[0];

for(iv=0;iv<64;iv++)
Cr[iv] *= hdr->qttable[hdr->useq[2]][iv];
unzigzag(Cr);
idct8x8(Cr);

for(iii=0;iii<8;iii++)
{
if( i + iii >= hdr->height)
break;
for(iv=0;iv<8;iv++)
{
if(ii + iv >= hdr->width)
break;
target = (i + iii) * hdr->width * 3 + (ii + iv) * 3;
luminance = lum[iii*8+iv]/64 + 128;
red = (int) (luminance + 1.402 * Cr[iii*8+iv]/64);
green = (int) (luminance - 0.34414 * Cb[iii*8+iv]/64 - 0.71414 * Cr[iii*8+iv]/64);
blue = (int) (luminance + 1.772 * Cb[iii*8+iv]/64);
red = clamp(red, 0, 255);
green = clamp(green, 0, 255);
blue = clamp(blue, 0, 255);
buff[target] = red;
buff[target+1] = green;
buff[target+2] = blue;
}
}

count++;
}

killbitstream(bs);
if(loadeoi(fp) == 0)
return 0;

return -1;
}

如您所见,数据是交错的。但是,如果您犯了错误,它将创建一个具有正确尺寸的特殊图像,而不是比预期更小的图像。

关于c - 任何大于 16x8 或 8x16 的图像尺寸的 JPEG 编码错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44137436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com