Dla wlasnorecznie zrobionej bitmapy w hexeditorze dziala , ma ona 3 pixele , ale dla duzego obrazka psuje sie niemilosiernie. Wygenerowany obraz jest po prostu zbiorem roznobarwnych plam. W strukturze table trzymam tablice kolorow. W strukturze data trzymam poszczegolne pixele. W pointer5->pixel_data[] chce zapisywac pixele dla bitmapy 32 bitowej. Liczylem tez wlasnorecznie na kartce co sie dzieje w tym kodze dla bitmapy 3x2 i wyglada dobrze.
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#pragma pack(push)
#pragma pack(1)
typedef struct Header{
uint16_t type;
uint32_t file_size;
uint32_t reserved;
uint32_t data_offset;
} Header;
typedef struct InfoHeader{
uint32_t Info_Header_Size;
int32_t width;
int32_t height;
uint16_t planes;
uint16_t bits_per_pixel;
uint32_t compression;
uint32_t image_size;
int32_t resolution_x;
int32_t resolution_y;
uint32_t colors_used;
uint32_t important_colors;
}InfoHeader;
typedef struct data{
unsigned char *pixel_data;
}data;
typedef struct table{
uint32_t *array;
}table;
#pragma pack(pop)
void grey_16(struct InfoHeader *pointer2,struct data*pointer3,struct data*pointer4);
int what_padding(struct InfoHeader *pointer2,int bits);
int main(int argc , char *argv[])
{
Header *pointer;
pointer = malloc(sizeof(Header));
FILE *fp = fopen( argv[1], "rb");
fread(pointer, sizeof(Header),1,fp);
InfoHeader * pointer2;
pointer2 = malloc(sizeof(InfoHeader));
fread(pointer2,sizeof(InfoHeader),1,fp);
table* pointer3;
pointer3 = malloc(sizeof(table));
pointer3->array = malloc(pointer2->colors_used);
fread(pointer3->array,pointer2->colors_used*4,1 ,fp);
data* pointer4;
pointer4 = malloc(sizeof(data));
pointer4->pixel_data = malloc(pointer2->image_size);
fread(pointer4->pixel_data,pointer2->image_size,1 ,fp);
int padding = what_padding(pointer2 , 1);
int a = pointer2->width;
int b = pointer2->height;
data* pointer5; pointer5 = malloc(sizeof(data));
pointer5->pixel_data = malloc( (pointer2->image_size - pointer2->height*padding)*4);
printf("%d, %d , %d, %d\n",pointer->type,pointer->file_size,pointer->reserved,pointer->data_offset);
printf("%d, %d , %d\n",pointer2->Info_Header_Size,pointer2->image_size,pointer2->colors_used);
for(int j = 0 ; j<b;j++)
{
for(int i =j*(a+padding);i< j*(a+padding)+a ; i++)
{
int pixel1 = pointer4->pixel_data[i];
uint32_t value = pointer3->array[pixel1];
int R = ((value&0xFF0000)>>16);
int G = ((value&0xFF00)>>8);
int B = (value&0xFF);
pointer5->pixel_data[0+i*4-j*4]=B;
pointer5->pixel_data[1+i*4-j*4]=G;
pointer5->pixel_data[2+i*4-j*4]=R;
pointer5->pixel_data[3+i*4-j*4]=0x0;
printf("%d, %d, %d\n",B,G,R);
}
}
pointer->file_size = 54 + 4*(pointer2->image_size-pointer2->height*padding);
pointer->data_offset =54;
pointer2->bits_per_pixel = 32;
pointer2->image_size = 4*(pointer2->image_size-pointer2->height*padding);
pointer2->colors_used = 0;
FILE *fw = fopen(argv[2], "wb");
fwrite(pointer, sizeof(Header),1,fw);
fwrite(pointer2,sizeof(InfoHeader),1,fw);
fwrite(pointer5->pixel_data,pointer2->image_size,1 ,fw);
free(pointer);
free(pointer2);
free(pointer3->array);
free(pointer3);
free(pointer4->pixel_data);
free(pointer4);
free(pointer5->pixel_data);
free(pointer5);
fclose(fp);
fclose (fw);
return 0;
}
int what_padding(struct InfoHeader *pointer2,int bits)
{
int a = pointer2->width;
int c = a*bits;
int padding=0;
if (c%4==0)
padding =0;
if (c%4==1)
padding =3;
if (c%4==2)
padding =2;
if (c%4==3)
padding =1;
return padding;
}