这两天在研究SSD202D平台上的png图片显示,下面分享 一下使用lodepng生成png图片
1、准备工作
下载lodepng源码:https://github.com/lvandeve/lodepng
lodepng官网:LodePNG
2、相关代码
lodepng_demo.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include "lodepng.h"
#define THIS_FILE "lodepng_demo.c"
/*
编译
arm-linux-gnueabihf-gcc lodepng_demo.c lodepng.c -o lodepng_demo
*/
static void rainbow_png(const char *filepath)
{
// 彩虹的七种颜色
uint32_t rainbow_colors[] =
{
0XFF0000, // 红
0XFFA500, // 橙
0XFFFF00, // 黄
0X00FF00, // 绿
0X007FFF, // 青
0X0000FF, // 蓝
0X8B00FF // 紫
};
const int width = 210;
const int height = 210;
int i = 0, j = 0;
unsigned char * rgb24_data = NULL;
rgb24_data = (unsigned char *)malloc(width * height * 3 * sizeof(unsigned char));
if (rgb24_data == NULL)
{
printf("[%s:%d] malloc failed !!!\n", __FUNCTION__, __LINE__);
return ;
}
memset(rgb24_data, 0, (width * height * 3 * sizeof(unsigned char)));
uint32_t cur_color = 0x00;
int cur_pixel_index = 0;
unsigned char red_color = 0x00;
unsigned char green_color = 0x00;
unsigned char blue_color = 0x00;
for (i = 0; i < width; i++)
{
// 当前颜色
cur_color = rainbow_colors[0];
if(i < 30)
{
cur_color = rainbow_colors[0];
}
else if(i < 60)
{
cur_color = rainbow_colors[1];
}
else if(i < 90)
{
cur_color = rainbow_colors[2];
}
else if(i < 120)
{
cur_color = rainbow_colors[3];
}
else if(i < 150)
{
cur_color = rainbow_colors[4];
}
else if(i < 180)
{
cur_color = rainbow_colors[5];
}
else if(i < 210)
{
cur_color = rainbow_colors[6];
}
// 当前颜色 R 分量
red_color = (unsigned char)((cur_color & 0xFF0000) >> 16);
// 当前颜色 G 分量
green_color = (unsigned char)((cur_color & 0x00FF00) >> 8);
// 当前颜色 B 分量
blue_color = (unsigned char)(cur_color & 0x0000FF);
// 每个扫描行前第一个字节是过滤器类型
rgb24_data[3 * (i * width) + i] = 0x00;
for (j = 0; j < height; j ++)
{
cur_pixel_index = 3 * (i * height + j);
// 按 RGB 顺序写入一个像素 RGB24 到文件中
rgb24_data[cur_pixel_index] = red_color;
rgb24_data[cur_pixel_index + 1] = green_color;
rgb24_data[cur_pixel_index + 2] = blue_color;
}
}
int error = lodepng_encode24_file(filepath, rgb24_data, width, height);
if (error != 0)
{
printf("error %u: %s\n", error, lodepng_error_text(error));
}
if (rgb24_data != NULL)
{
free(rgb24_data);
rgb24_data = NULL;
}
}
int main(int argc, char* argv[])
{
if (argc != 2)
{
printf("args should be tow, such as: ./proc 1.png\n");
return 0;
}
rainbow_png(argv[1]);
return 0;
}
3、编译代码和运行结果
arm-linux-gnueabihf-gcc lodepng_demo.c lodepng.c -o lodepng_demo
相关代码下载:lodepng_demo
参考文献:使用开源库生成PNG图片