/*
* coding by joe.lin for picture bmp convert rgb565
* gcc rgb565_conver.c -o rgb565_conver
* ./rgb565_conver dog.bmp dy.h
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct {
unsigned short width;
unsigned short height;
unsigned char* data;
} Image;
Image loadImage(const char* filename) {
FILE* file = fopen(filename, "rb");
if (file == NULL) {
printf("Failed to open file: %s\n", filename);
exit(1);
}
fseek(file, 0, SEEK_END);
long fileSize = ftell(file);
rewind(file);
unsigned char* buffer = (unsigned char*)malloc(fileSize);
if (buffer == NULL) {
printf("Memory allocation failed.\n");
fclose(file);
exit(1);
}
size_t result = fread(buffer, 1, fileSize, file);
if (result != fileSize) {
printf("Failed to read file: %s\n", filename);
fclose(file);
free(buffer);
exit(1);
}
fclose(file);
// Assuming the image is a RGB888 BMP image
unsigned short width = 240;
unsigned short height = 320;
unsigned char* imageData = buffer + 54; // Skip BMP header
Image image;
image.width = width;
image.height = height;
image.data = buffer;
return image;
}
void saveAsRGB565IntArray(const Image* image, const char* outputFilename) {
FILE* file = fopen(outputFilename, "w");
if (file == NULL) {
printf("Failed to create file: %s\n", outputFilename);
return;
}
fprintf(file, "#ifndef IMAGE_DATA_H\n");
fprintf(file, "#define IMAGE_DATA_H\n\n");
fprintf(file, "const int imageDataLength = %d;\n", image->width * image->height);
fprintf(file, "const unsigned int gImage_logo[] = {\n");
for (int i = 0; i < image->height; i++) {
for (int j = 0; j < image->width; j++) {
unsigned char r = *(image->data + ((image->height - 1 - i) * image->width + j) * 3 + 2);
unsigned char g = *(image->data + ((image->height - 1 - i) * image->width + j) * 3 + 1);
unsigned char b = *(image->data + ((image->height - 1 - i) * image->width + j) * 3);
unsigned int rgb565 = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);
fprintf(file, "0x%04X, ", rgb565);
}
fprintf(file, "\n");
}
fprintf(file, "};\n\n");
fprintf(file, "#endif // IMAGE_DATA_H\n");
fclose(file);
}
int main(int argc, char* argv[]){
if (argc < 3) {
printf("Please provide input and output filenames.\n");
return 1;
}
const char* filename = argv[1];
const char* outputFilename = argv[2];
Image image = loadImage(filename);
// 调整图像数据的处理顺序
int width = image.width;
unsigned char* newImageData = (unsigned char*)malloc(image.width * image.height * 3);
int index = 0;
for (int i = 0; i < image.height; i++) {
for (int j = 18; j < width; j++) { // 使用除了左侧18个像素点以外的索引范围
for (int k = 0; k < 3; k++) {
newImageData[index++] = image.data[(i * width + j) * 3 + k];
}
}
for (int j = 0; j < 18; j++) { // 使用左侧18个像素点的索引范围
for (int k = 0; k < 3; k++) {
newImageData[index++] = image.data[(i * width + j) * 3 + k];
}
}
}
free(image.data);
image.data = newImageData;
saveAsRGB565IntArray(&image, outputFilename);
free(image.data);
printf("Image conversion completed.\n");
return 0;
}
图片转数组rgb565-240*320
最新推荐文章于 2024-02-07 15:28:39 发布