图片转数组rgb565-240*320

/*
 *  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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值