基于标准C,适用于小型嵌入式设备的PNG转RGB库,亲测可用

基于标准C,适用于小型嵌入式设备的PNG转RGB库,亲测可用

下载链接

GITHUB:http://lodev.org/lodepng/

C语言使用lodepng.c和lodepng.h这两个文件就可以完成png转rgb的操作

重要的api接口

/*需要提前从文件中读取文件内容*/
unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) {
  return lodepng_decode_memory(out, w, h, in, insize, LCT_RGB, 8);
}	//解码24位png图片
unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) {
  return lodepng_decode_memory(out, w, h, in, insize, LCT_RGBA, 8);
}	//解码32位png图片

/*api预置了从文件中读取内容的操作*/
unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) {
  return lodepng_decode_file(out, w, h, filename, LCT_RGB, 8);
}	//解码24位png图片
unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) {
  return lodepng_decode_file(out, w, h, filename, LCT_RGBA, 8);
}	//解码32位png图片

例子

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "lodepng.h"
#include <unistd.h>
#include <stdlib.h>

int main()
{

	unsigned char *png_data = NULL;

	int fd=open("./test.png",O_RDWR);
	size_t filesize=lseek(fd, 0,SEEK_END);
	lseek(fd, 0,SEEK_SET);
	
	printf( "test.png size:%ld ",filesize);
	png_data=(unsigned char *)malloc(filesize);
	memset(png_data, 0, filesize);
	read(fd, png_data, filesize);
	
	unsigned char *rgb_data = NULL;
    unsigned  width,height;	
    int ret = lodepng_decode_memory(&rgb_data, &width, &height, png_data, filesize, LCT_RGBA, 8);	//32位png图片,位深度8bit,转RGB888
    if (ret != 0) {
        printf( "lodepng decode failed %d\n",ret);
    }

	printf("width:%d heught:%d \n",width,height);

	int i;
	printf("png data:\n");
	for(i=0;i<filesize;i++){
		printf("%02X ",png_data[i]);
	}
	printf("\n");

	printf("rgb_data:\n");
	for(i=0;i<width*height;i++){
		printf("%02X ",rgb_data[i]);
	}
	printf("\n");
	
	close(fd);
	free(png_data);

}

执行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

### STM32设备上显示蔡徐坤图像或字符的方法 要在基于STM32的开发板上通过LCD屏幕显示蔡徐坤的相关图像或字符,通常需要完成以下几个方面的配置和编程: #### 1. **硬件准备** 确保使用的OLED显示屏支持I2C或SPI通信协议,并确认其分辨率满足需求。例如,引用提到的屏幕分辨率为128x64像素[^1],这非常适合用于小型嵌入式系统的图形化界面。 对于此屏幕,SSD1306驱动芯片提供了良好的性能支持,包括内置的1KB显示缓存以及多种寻址模式(页面寻址模式和列寻址模式)。这些特性使得开发者可以灵活地控制每个像素的状态,从而实现高质量的文字、图形甚至动态动画展示。 #### 2. **软件的选择** 为了简化操作过程并提高效率,推荐使用现成的开源来初始化和管理SSD1306 OLED显示器的工作状态。常用的有Adafruit SSD1306或者U8g2。它们都提供了一系列API函数帮助快速绘制线条、矩形框、字符串以及加载位图文件到屏幕上。 #### 3. **图片换为字节数组** 由于微控制器内存资源有限,直接存储BMP或其他格式的大尺寸彩色照片并不现实。因此,需先将目标图像(比如蔡徐坤头像)缩小至适合屏幕大小 (即128x64),然后将其化为单色黑白图案形式保存为数组结构供程序调用。具体做法如下: - 使用工具如ImageMagick命令行工具或者在线服务把原始RGB色彩丰富的JPEG/PNG码成为仅有黑白色的XBM/XPM格式。 ```bash convert input.jpg -resize 128x64\! -monochrome output.xbm ``` - 接着解析生成后的`.xbm`文件提取其中定义好的二进制数据序列作为最终要烧录进去MCU flash里的静态常量表项。 以下是假设已经获得了一个名为 `kun_image[]` 的全局变量表示上述处理完毕的结果样本片段: ```c const unsigned char kun_image[] PROGMEM = { 0b00000000, 0b00000000, ... }; ``` 注意这里采用了PROGMEM宏指示编译器将该大块只读资料放置于Flash而非RAM之中节省运行期可用空间配额。 #### 4. **编写绘图代码** 最后一步就是在主循环里加入实际渲染逻辑了。下面给出了一段示范性的源代码用来说明怎样利用之前介绍过的那些组件协同工作起来呈现指定位置上的预设图标样式给用户观看体验享受乐趣无穷啊! ```c #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT); void setup() { if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 allocation failed")); for(;;); // Don't proceed, loop forever } } void drawBitmapExample(){ int16_t x=0,y=0; uint16_t w,h; display.clearDisplay(); display.drawBitmap(x, y, kun_image, 128, 64, WHITE); display.display(); } void loop() { drawBitmapExample(); } ``` 以上脚本实现了启动后立即将预先设定好参数值传送给对应方法执行动作达到预期效果的目的。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值