stm32 h743的jpeg压缩硬件压缩的测试实例及问题
stm32 h743的jpeg压缩硬件压缩的测试实例及问题
代码就不上了,主要是抄袭实例代码
encode_dma.c
jpeg_utils.c
jpeg_utils.h
jpeg_utils_conf.h四个文件
问题描述:不管压缩什么图,jpg图像发绿(灰度图像无所谓),经过测试发现宽度128或64,高度任意的图像压缩后jpg是正常的,猜测是jpg压缩核的限制,所以对代码进行了修改,将bmp按顺序以128*16小块数据从左到右,从上到下读出进行压缩,压缩后的jpg数据顺序是对的,具体原因参考jpeg压缩原理中的压缩数据流存储顺序。硬件初始化时必须设置相应寄存器中的图像大小为128宽,高度为w*h/128,压缩结束后在生成的jpg文件中将图像的宽度和高度再修改为对应的w h即可。
另外rgb转YCRCB时,相关代码不要+128,溢出后会导致CR=0或者cb=0,改为127即可.
测试768*576的yuv图像需要33ms,1024*768的yuv图像需要65ms,yuv图像的话下面的代码需要重写,如果用rgb的时间更长,主要消耗在rgb转ycrcb上了
ycomp = (int32_t)(*(RED_Y_LUT + red)) + (int32_t)(*(GREEN_Y_LUT + green)) + (int32_t)(*(BLUE_Y_LUT + blue));
cbcomp = (int32_t)(*(RED_CB_LUT + red)) + (int32_t)(*(GREEN_CB_LUT + green)) + (int32_t)(*(BLUE_CB_RED_CR_LUT + blue)) + 127;
crcomp = (int32_t)(*(BLUE_CB_RED_CR_LUT + red)) + (int32_t)(*(GREEN_CR_LUT + green)) + (int32_t)(*(BLUE_CR_LUT + blue)) + 127;
此处压缩768*576的图像,如有其它分辨率的请相应修改。
重点jpeg_utils_conf.h中添加
#define JPEG_SWAP_RG 1 //这个没有什么用处,个人认为
#define JPEG_SWAP_RB 0 //BMP中红绿蓝存储为BGR顺序
encode_dma.c中添加:
#define JPEG_CHROMA_SAMPLING JPEG_420_SUBSAMPLING
#define JPEG_COLOR_SPACE JPEG_YCBCR_COLORSPACE #define JPEG_IMAGE_QUALITY 75
#define MAX_INPUT_WIDTH 128 //这里必须是128,否则图片会绿
#define MAX_INPUT_LINES 16
#define BLOCKCOLUMN 128
#define MAX_INPUT_BLOCKCOLUMN (768/BLOCKCOLUMN)
#define CHUNK_SIZE_IN ((uint32_t)(MAX_INPUT_WIDTH * BYTES_PER_PIXEL * MAX_INPUT_LINES))
#define CHUNK_SIZE_OUT ((uint32_t) (CHUNK_SIZE_IN/2))
BMP_GetInfo(pBmpFile, &Conf);
Conf.ImageHeight = 768*576/128;//重点,添加
Conf.ImageWidth = 128;//重点
JPEG_GetEncodeColorConvertFunc(&Conf, &pRGBToYCbCr_Convert_Function, &MCU_TotalNb);
Jpeg_OUT_BufferTab.DataBufferSize = 0;
Jpeg_OUT_BufferTab.State = JPEG_BUFFER_EMPTY;
ReadBmpRgbLines1(pBmpFile, Conf, Input_Data_Buffer ,&dataBufferSize);
//下面函数相当于从768*576的图像中,按顺序每次读取128*16大小的小块图像数据
static void ReadBmpRgbLines1(FIL *file, JPEG_ConfTypeDef Conf2, uint8_t * pDataBuffer, uint32_t *BufferSize)
{
uint32_t bytesReadfile = 1;
uint32_t CurrentBlockLine = 1;
*BufferSize = 0;
JPEG_ConfTypeDef Conf1;
Conf1.ImageHeight = 576;
Conf1.ImageWidth = 768;
while((CurrentLine <= Conf1.ImageHeight) && (CurrentBlockLine <= MAX_INPUT_LINES))
{
f_lseek (file,BMP_HEADER_SIZE + Conf1.ImageWidth *(Conf1.ImageHeight - CurrentLine)*3 + CurrentBlockColumn*BLOCKCOLUMN*3);
f_read (file, pDataBuffer , BLOCKCOLUMN*3 , (UINT*)(&bytesReadfile));
pDataBuffer += bytesReadfile;
*BufferSize += bytesReadfile;
CurrentLine +=1 ;
CurrentBlockLine += 1;
}
CurrentBlockColumn += 1;
if(CurrentBlockColumn == MAX_INPUT_BLOCKCOLUMN)
{
CurrentLineForRead += MAX_INPUT_LINES;
}
CurrentLine = CurrentLineForRead;
CurrentBlockColumn = CurrentBlockColumn%MAX_INPUT_BLOCKCOLUMN;
}
stm32 h743的jpeg压缩硬件压缩的测试实例及问题相关推荐
- 【W5500】STM32 H743驱动W5500进行UDP收发
前景提要 STM32 H743确实是个好芯片,但是这个MAC只有一个真是让我觉得不太够,想整双MAC的A核芯片玩玩,奈何实在也是没得精力弄Linux,虽然imx6ull也是一个好芯片.... 外挂MA ...
- C#图片截取压缩(百分比压缩/大小压缩)实现代码
原文链接:http://www.jb51.net/article/33622.htm 脚本之家 为了娱乐写了个截取图片和压缩图片你的小工具:按照百分比压缩/制定大小压缩等等,感兴趣的朋友可以了解下 ...
- 三种Android图片压缩方法 压缩到指定大小
一.图片质量压缩 /*** 质量压缩方法* @param image* @return*/ public static Bitmap compressImage(Bitmap image) {Byte ...
- sql server压缩_SQL Server 2016中的压缩和解压缩功能
sql server压缩 The concept of data compression is not a new on for SQL Server Database Administrators ...
- LZ77算法压缩和解压缩
LZ77简介 Ziv和Lempel于1977年发表题为"顺序数据压缩的一个通用算法(A Universal Algorithm for Sequential Data Compression ...
- asp在线压缩和解压缩文件(文件夹)
asp在线压缩和解压缩文件(文件夹) <% '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ '\\ '\\ 1. c:\ ...
- java 解压与压缩代码_Java实现多文件压缩和解压缩代码详解
Java实现多文件压缩和解压缩代码 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStre ...
- Java 的zip压缩和解压缩
Java 的zip压缩和解压缩 好久没有来这写东西了,今天中秋节,有个东西想拿出来分享,一来是工作中遇到的问题,一来是和csdn问候一下,下面就分享一个Java中的zip压缩技术,代码实现比较简单,代 ...
- Linux之压缩和解压缩命令
Linux之压缩和解压缩命令 1. 压缩格式的介绍 Linux默认支持的压缩格式: .gz .bz2 .zip 说明: .gz和.bz2的压缩包需要使用tar命令来压缩和解压缩 .zip的压缩包需要使 ...
最新文章
- python使用matplotlib可视化阶梯图、使用step函数可视化阶梯图、可视化时间序列数据的波动周期和规律
- 人工智能产业的发展是什么样的呢?
- python3爬虫入门教程-有什么好的python3爬虫入门教程或书籍吗?
- SQL Server 2005 镜像构建说明(转载)
- OpenCV绘图和文本输出功能的实例(附完整代码)
- opencv3.4.3的DNN模块调用bvlc_googlenet.caffemodel实现图像分类
- eclipse 如何关联git_作为一名初学Java者 如何做简单的Java项目
- easyUI 之datagrid 在前端自定义排序
- C++学习008-delete与delete[]的差别
- 【转】VMware网络连接模式—桥接、NAT以及仅主机模式的详细介绍和区别
- 今天进行的将zzb从apache迁移到nginx
- python aes加密每次密码不一样_记AES加密在linux系统每次都不一样的问题
- html 树 excel,用Excel实现简易树状关系
- Mac系统如何关闭指定端口号
- [渝粤教育] 四川轻化工大学 化工设备机械基础 参考 资料
- Spring Cloud的注册中心和服务者,消费者的构建
- 利用Matlab进行灰色预测,利用matlab进行灰色预测.pdf
- Java比较两个数组是否相等(equals())
- 字符编码的常用种类介绍
- 利用框架效应达成目的