[STM32H7]

【STM32H7S78-DK测评】JPEG图片解码测试

[复制链接]
73|0
手机看帖
扫描二维码
随时随地手机跟帖
SJZhu|  楼主 | 2024-10-6 12:04 | 显示全部楼层 |阅读模式
本帖最后由 SJZhu 于 2024-10-6 12:01 编辑

JPEG和ARGB8888是两种不同的图像数据表示方式,主要用于不同的用途和情境。它们之间的区别和联系如下:
区别:
  • 数据格式类型:

    • JPEG:是一种压缩的图像格式,采用有损压缩算法,主要用于存储和传输数字图像。JPEG文件通常以.jpg或.jpeg为扩展名。
    • ARGB8888:是一种不压缩的像素格式,表示每个像素的颜色信息。它是一种32位的格式,每个通道(Alpha、Red、Green、Blue)各占8位。
  • 用途:

    • JPEG:由于支持高效压缩且文件大小较小,JPEG非常适合用于互联网图片、数码相片以及需要快速传输的场合。
    • ARGB8888:适用于需要高精度和完全质量的图像处理场合,比如图形渲染和图像编辑,因为它能完整保留每个像素的颜色信息。
  • 压缩方式:

    • JPEG:使用有损压缩,可以大幅减小文件体积,但会导致一定的图像质量损失。
    • ARGB8888:不进行压缩,保留完整的图像信息,因此占用更多存储空间。
  • 渲染性能:

    • JPEG:需要解码过程,通常较适于图片展示而不是实时图形操作。
    • ARGB8888:直接存储每个像素的数据,适合用于对图像进行实时操作和精细化处理。

联系:
  • 图像表示:

    • 两者都是用于图像的表示方式,一个用于压缩存储,一个用于直接表示颜色数据。它们可以在图像处理过程中相互转换。
  • 互操作性:

    • 一幅图像可以从ARGB8888格式编码为JPEG以便储存或传输,也可以从JPEG解码回ARGB8888进行编辑和处理。
  • 常见使用场景:

    • 图像文件通常在存储时使用JPEG格式以节省空间,而在实际处理或编辑时会被解码为诸如ARGB8888等不压缩格式。


JPG格式的文件,可以通过下面的Python脚本转换为16进制:
from PIL import Image
import binascii

import re

def jpg_to_hex(file_path):
    # 打开图像
    with open(file_path, 'rb') as image_file:
        # 读取文件的二进制数据
        binary_data = image_file.read()
        # 将二进制数据转换为十六进制
        hex_data = binascii.hexlify(binary_data)
        #return hex_data
        # 转换为字符串
        hex_string = hex_data.decode('utf-8')
        return hex_string

# 示例用法
file_path = 'example.jpg'
hex_representation = jpg_to_hex(file_path)
#print(hex_representation)

split_str = [hex_representation[i:i+2] for i in range(0, len(hex_representation), 2)]
print(split_str)



在图形化配置界面,首先使能JPEG模块,然后使能HPDMA模块:

7761667020830b3fb2.png

160786702083d6cb10.png

2219367020879b8524.png



55019670208a1aa312.png

LTDC显示还是使用上一个工程的配置方式:
80463670208d5ceff0.png


主函数通过调用MX_JPEG_Init -> HAL_JPEG_Init(&hjpeg)来初始化硬件JPEG模块
LTDC模块初始化代码:
/**
  * [url=home.php?mod=space&uid=247401]@brief[/url] LTDC Initialization Function
  * @param None
  * @retval None
  */
static void MX_LTDC_Init(void)
{

  /* USER CODE BEGIN LTDC_Init 0 */

  /* USER CODE END LTDC_Init 0 */

  LTDC_LayerCfgTypeDef pLayerCfg = {0};

  /* USER CODE BEGIN LTDC_Init 1 */

  /* USER CODE END LTDC_Init 1 */
  hltdc.Instance = LTDC;
  hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;
  hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;
  hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;
  hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
  hltdc.Init.HorizontalSync = 3;
  hltdc.Init.VerticalSync = 3;
  hltdc.Init.AccumulatedHBP = 11;
  hltdc.Init.AccumulatedVBP = 11;
  hltdc.Init.AccumulatedActiveW = 811;
  hltdc.Init.AccumulatedActiveH = 491;
  hltdc.Init.TotalWidth = 819;
  hltdc.Init.TotalHeigh = 499;
  hltdc.Init.Backcolor.Blue = 0;
  hltdc.Init.Backcolor.Green = 0;
  hltdc.Init.Backcolor.Red = 0;
  if (HAL_LTDC_Init(&hltdc) != HAL_OK)
  {
    Error_Handler();
  }
  pLayerCfg.WindowX0 = 0;
  pLayerCfg.WindowX1 = 320;
  pLayerCfg.WindowY0 = 0;
  pLayerCfg.WindowY1 = 240;
  pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;
  pLayerCfg.Alpha = 127;
  pLayerCfg.Alpha0 = 0;
  pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
  pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;
  pLayerCfg.FBStartAdress = (uint32_t)&image_data_Cloud_320_240;
  pLayerCfg.ImageWidth = 320;
  pLayerCfg.ImageHeight = 240;
  pLayerCfg.Backcolor.Blue = 0;
  pLayerCfg.Backcolor.Green = 0;
  pLayerCfg.Backcolor.Red = 0;
  if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN LTDC_Init 2 */

  /* USER CODE END LTDC_Init 2 */

}


主函数代码:
int main(void)
{

  /* USER CODE BEGIN 1 */
  uint32_t toBottom = 0;
  uint32_t toTop = 0;

  /* STM32H7RSxx HAL library initialization:
       - Systick timer is configured by default as source of time base, but user
             can eventually implement his proper time base source (a general purpose
             timer for example or other time source), keeping in mind that Time base
             duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and
             handled in milliseconds basis.
       - Set NVIC Group Priority to 4
       - Low Level Initialization
     */

  MPU_Config();
  /* USER CODE END 1 */

  /* Enable the CPU Cache */

  /* Enable I-Cache---------------------------------------------------------*/
  SCB_EnableICache();

  /* Enable D-Cache---------------------------------------------------------*/
  SCB_EnableDCache();

  /* MCU Configuration--------------------------------------------------------*/

  /* Update SystemCoreClock variable according to RCC registers values. */
  SystemCoreClockUpdate();

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* Initialize LD1 and LD2*/
  BSP_LED_Init(LD1);
  BSP_LED_Init(LD2);
  BSP_LED_Init(LD3);
  BSP_LED_Init(LD4);
  /* USER CODE END Init */

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_HPDMA1_Init();
  MX_ADC1_Init();
  MX_USART1_UART_Init();
  MX_JPEG_Init();
  MX_LTDC_Init();
  /* USER CODE BEGIN 2 */
tickstart = HAL_GetTick();
JPEG_Decode_DMA(&hjpeg, (uint32_t)image_320_240_jpg, IMAGE_320_240_JPG_SIZE, (uint32_t) rawBuffer);

while((Jpeg_HWDecodingEnd == 0) && ((HAL_GetTick() - tickstart) < 5000))
  {
  }

  if (Jpeg_HWDecodingEnd != 0)
  {
        /* Test ends properly */
    BSP_LED_On(LD1);
  }
  else
  {
        /* Test error */
    BSP_LED_On(LD2);
  }   

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while(1){
      HAL_LTDC_SetAddress(&hltdc, (uint32_t)rawBuffer, 0);
      HAL_LTDC_Reload( &hltdc,LTDC_RELOAD_IMMEDIATE);
      BSP_LED_Toggle(LD3);
      BSP_LED_Toggle(LD4);
      HAL_Delay(1000);
      HAL_LTDC_SetAddress(&hltdc, (uint32_t)&image_data_Cloud_320_240, 0);
      HAL_LTDC_Reload( &hltdc,LTDC_RELOAD_IMMEDIATE);
      BSP_LED_Toggle(LD3);
      BSP_LED_Toggle(LD4);
      HAL_Delay(1000);
}
}


此外烧录到板子后发现解码的图片没有正常显示,可能是LTDC配置参数与解码结果不兼容,目前还在调试中。解码后的数据在调试界面看到也有数据。


596567020b8dc8e43.png










使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

19

帖子

0

粉丝