查看: 403|回复: 1

[求助] 请教下rt1176 csi camera rgb 例程颜色转换后的显示问题 ?

[复制链接]

该用户从未签到

8

主题

27

帖子

0

注册会员

Rank: 2

积分
134
最后登录
2024-1-31
发表于 2023-9-25 09:22:52 | 显示全部楼层 |阅读模式
本帖最后由 eefocus_3733915 于 2023-9-25 16:05 编辑


请教下rt1176 csi camera rgb 例程颜色转换后的显示问题 ?

sdk 官方例程里面使用了 pxp ,显示出来的图片颜色是正常的,但就是如果想指定地址位置显示还没有搞清楚该怎么设置,所以自己另外单独搞了一个转换函数,自己搞的转换函数基本能够显示出图片,但貌似就是颜色有偏差

部分函数如下:
                while(1) {
        /* Wait to get the full frame buffer to show. 等待获取完整帧缓冲区以显示 */
        while(kStatus_Success != CAMERA_RECEIVER_GetFullBuffer(&cameraReceiver, &cameraReceivedFrameAddr))
        {

        }

                 // 自己捣鼓的 把 camera 的 xrgb 数据转换为 rgb565 并进行显示   
                   LCD_DrawBMP_32bit_Convert_16bit ((_DEMO_BUFFER_WIDTH/2) - (_DEMO_CAMERA_WIDTH/2),
                                                            (_DEMO_BUFFER_HEIGHT/2) - (_DEMO_CAMERA_HEIGHT/2),
                                                            _DEMO_CAMERA_HEIGHT, _DEMO_CAMERA_WIDTH, ( void *)cameraReceivedFrameAddr);  // 显示成功 ok
                  
        /* Return the camera buffer to camera receiver handle. */
        CAMERA_RECEIVER_SubmitEmptyBuffer(&cameraReceiver, (uint32_t)cameraReceivedFrameAddr);
      // cameraReceivedFrameAddr 这个地址里面的数据应该就是 xrgb 8888 格式的吧 ??

}


/*
*********************************************************************************************************
*        函 数 名: LCD_DrawBMP_32bit_Convert_16bit
*        功能说明: 在LCD上显示一个 MBP 位图,位图点阵扫描次序:从左到右,从上到下
*           把 32bit argb8888 数据转化为 16bit rgb565 格式
*        形    参:  
*                        _usX, _usY : 图片的坐标
*                        _usHeight  :图片高度
*                        _usWidth   :图片宽度
*                        _ptr       :图片点阵指针, 传进来的是 argb8888 数据,
*        返 回 值: 无
*********************************************************************************************************
*/
void LCD_DrawBMP_32bit_Convert_16bit(uint16_t _usX, uint16_t _usY, uint16_t _usHeight, uint16_t _usWidth, const void *_ptr)
{

        uint16_t rgb565=0;
        uint16_t h, x, y;
        __IO uint8_t *ptr;
        __IO uint16_t(*frameBuffer)[g_LcdWidth] = (void *)s_CurrentFrameBuffer;          // lcd 显存地址
        if(!_ptr)  return;
        ptr = (uint8_t *)_ptr;
        y = _usY;
        
        for (h = 0; h < _usHeight; h++)
        {
                for (x = 0; x < _usWidth; x++)
                {
                        ptr ++;          // 跳过最高 8位不用
                        rgb565 = (uint16_t)((ptr[2]>>3)<<11)+(uint16_t)((ptr[1]>>2)<<5)+(uint16_t)(ptr[0]>>3);     // 把 rgb888 转化为 rgb565
                        frameBuffer[y][_usX + x] = rgb565;   // 开始显示
                        ptr += 3;
                }
                y ++;
        }
}


大佬帮忙看看是哪里转换的不对 ??

回复

使用道具 举报

该用户从未签到

8

主题

27

帖子

0

注册会员

Rank: 2

积分
134
最后登录
2024-1-31
 楼主| 发表于 2023-10-8 10:17:45 | 显示全部楼层


自己回答这个问题,终于搞定了

                for (x = 0; x < _usWidth; x++)
                {
   
                        rgb565 = (uint16_t)((ptr[2]>>3)<<11)+(uint16_t)((ptr[1]>>2)<<5)+(uint16_t)(ptr[0]>>3);     // 把 rgb888 转化为 rgb565
                        frameBuffer[y][_usX + x] = rgb565;   // 开始显示
                        ptr += 4;
                }
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2024-4-29 11:32 , Processed in 0.103622 second(s), 19 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表