Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaScript从JPEG访问原始YUV值_Javascript_Canvas_Jpeg_Rgb_Yuv - Fatal编程技术网

使用JavaScript从JPEG访问原始YUV值

使用JavaScript从JPEG访问原始YUV值,javascript,canvas,jpeg,rgb,yuv,Javascript,Canvas,Jpeg,Rgb,Yuv,我已将JPEG图像动态加载到2D html画布中,我希望访问原始YCbCr像素值 据我所知,JPEG在YCbCr中对像素数据进行编码,但chrome似乎在使用getImageData()访问时将其转换为RGB 我曾尝试使用RGB到YCbCr的转换计算,但这似乎是一种有损转换,因为它们不能完美地1:1映射 是否可以在JavaScript中访问原始YCbCr像素值?是和否 当浏览器使用本机方法(即图像元素)加载图像时,YCbCr(在JPEG的情况下)将由浏览器和ICC自动转换为RGB空间,支持该方法

我已将JPEG图像动态加载到2D html画布中,我希望访问原始YCbCr像素值

据我所知,JPEG在YCbCr中对像素数据进行编码,但chrome似乎在使用getImageData()访问时将其转换为RGB

我曾尝试使用RGB到YCbCr的转换计算,但这似乎是一种有损转换,因为它们不能完美地1:1映射

是否可以在JavaScript中访问原始YCbCr像素值?

是和否

当浏览器使用本机方法(即图像元素)加载图像时,YCbCr(在JPEG的情况下)将由浏览器和ICC自动转换为RGB空间,支持该方法的浏览器将应用gamma校正

这意味着当图像加载并准备好使用时,它已经在RGB空间中(这是正确的,因为监视器是RGB)。画布在此过程中没有任何部分,始终包含像素作为RGBA。因此,当使用
getImageData()
时,所有支持canvas的浏览器都将以RGBA的形式返回数据

访问原始YCbCr的唯一方法是自己对原始文件进行低级解析。您可以在任何可以迭代字节(包括JavaScript)的语言中执行此操作。对于JS,我建议使用类型化数组和数据视图来解析数据,但要注意:这很乏味,而且容易出错(因为它本身就是一个完整的项目),但如果您绝对需要原始数据,则完全可以这样做


另一种方法是将RGB转换回YCbCr,但色度和上述颜色和伽马校正可能会影响结果,使其与原始原始数据(以任何方式都是压缩形式)不完全相同。您还可以使用canvas元素上的
toDataURL()
方法将画布导出为JPEG。

我知道这是一个非常老的问题,但希望提供更新,直接从YUV平面对一些JPEG和WebP图像进行Chrome处理。您必须启用GPU光栅化(并禁用金属),有时可能需要从启用该功能chrome://flags


您可以运行跟踪,解码图像,包括闪烁类别,并查看是否有任何事件弹出进行YUV解码。如果是这样的话,那么您可以尝试从JavaScript直接访问YUV平面,尽管我承认我怀疑这是否会开箱即用(出于管道/安全原因)

我决定使用JavaScript JPEG解压库来访问原始YUV组件。明确地