如何镜像swscale PIX_FMT_YUYV422

发布于 2024-12-29 23:23:13 字数 671 浏览 2 评论 0原文

我正在尝试水平镜像 libswscale PIX_FMT_YUYV422 类型图像。对每行使用每像素 16 位的简单循环会导致颜色错误,例如蓝色对象是橙色。这是我的代码:

   typedef unsigned short YUVPixel; // 16 bits per pixel
    for (int y = 0; y < outHeight; y++)
    {
        YUVPixel *p1 = (YUVPixel*)pBits + y * outWidth;
        YUVPixel *p2 = p1 + outWidth - 1;
        for (int x = 0; x < outWidth/2; x++) // outWidth is image width in pixels
        {
            // packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
            unsigned short tmp;
            tmp = *p1;
            *p1 = *p2;
            *p2 = tmp;
        }
    }

然后我尝试将 YUVPixel 重新定义为 32 位类型并相应地修改我的循环。这会产生正确的颜色,但看起来相邻像素被交换了。有什么想法吗,我完全迷失了?

I'm trying to mirror libswscale PIX_FMT_YUYV422-type image horizontally. Using simple loop for each line with 16-bits per pixel results in having colors wrong, for example blue objects are orange. Here is my code:

   typedef unsigned short YUVPixel; // 16 bits per pixel
    for (int y = 0; y < outHeight; y++)
    {
        YUVPixel *p1 = (YUVPixel*)pBits + y * outWidth;
        YUVPixel *p2 = p1 + outWidth - 1;
        for (int x = 0; x < outWidth/2; x++) // outWidth is image width in pixels
        {
            // packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
            unsigned short tmp;
            tmp = *p1;
            *p1 = *p2;
            *p2 = tmp;
        }
    }

Then I tried redefining YUVPixel as 32-bit type and modifying my loop accordingly. This results in correct colors, but looks like neighboring pixels are swapped. Any ideas, I'm totally lost with this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

原谅我要高飞 2025-01-05 23:23:13

您使用 32 位 YUVPixel 类型的方法很好,您只需确保在移动像素结构后交换该像素结构内的两个 Y 值,例如:

Y0 U Y1 V
                move to new position      
          -------------------------------->
                                            Y0 U Y1 V
                                              <swap>
                                            Y1 U Y0 V

U 和 V 值对于整个 2 像素结构都有效, Y 值必须翻转。

Your approach using a 32bit YUVPixel type was good, you only have to make sure you swap the two Y values inside that pixel structure after moving it around, e.g.:

Y0 U Y1 V
                move to new position      
          -------------------------------->
                                            Y0 U Y1 V
                                              <swap>
                                            Y1 U Y0 V

The U and V values are both valid for the whole 2-pixel-structure, the Y values have to be flipped.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文