ScrapExplorer - bitmap.c

Home / lab / c / bitmap Lines: 18 | Size: 2626 bytes [Download] [Show on GitHub] [Search similar files] [Raw] [Raw (proxy)]
[FILE BEGIN]
1/** 2 * BITMAP 3 * © 2025 0x4248 4 */ 5 6#include <stdio.h> 7#include <stdlib.h> 8#include <stdint.h> 9#include "bmp_head.h" 10#include "bmp_pixel.h" 11 12void printRGB(PIXEL24 *pixels, int width, int height, int row_padded) { 13 for (int x = 0; x < width; x++) { 14 PIXEL24 *row = (PIXEL24 *)((uint8_t *)pixels + (height - 1 - x) * row_padded); 15 for (int y = 0; y < height; y++) { 16 printf("%d,%d:%u,%u,%u\n", 17 x, y, row[x].r, row[x].g, row[x].b); 18 } 19 } 20} 21 22int main(int argc, char *argv[]) { 23 if (argc != 2) { 24 printf("Usage: %s <bitmap_file.bmp>\n", argv[0]); 25 return 1; 26 } 27 28 const char *filename = argv[1]; 29 FILE *fp = fopen(filename, "rb"); 30 if (!fp) { 31 perror("Error opening file"); 32 return 1; 33 } 34 35 BM_FILE_HEAD fileHeader; 36 37 38 fread(&fileHeader, sizeof(BM_FILE_HEAD), 1, fp); 39 BM_INFO_V3 infoHeaderV3 = {0}; 40 BM_INFO_V2 infoHeaderV2 = {0}; 41 BM_INFO_V1 infoHeader = {0}; 42 43 printf("Reading base header\n"); 44 fread(&infoHeader, sizeof(BM_INFO_V1), 1, fp); 45 46 switch (fileHeader.biSize) { 47 case 52: 48 printf("Using V2\n"); 49 fread(&infoHeaderV2, sizeof(BM_INFO_V2), 1, fp); 50 break; 51 52 case 56: 53 printf("Using V2\n"); 54 fread(&infoHeaderV2, sizeof(BM_INFO_V2), 1, fp); 55 printf("Using V3\n"); 56 fread(&infoHeaderV3, sizeof(BM_INFO_V3), 1, fp); 57 break; 58 59 default: 60 printf("Only using V1"); 61 fclose(fp); 62 return 1; 63 } 64 65 if (fileHeader.bfType != 0x4D42) { // 'BM' in little endian 66 printf("Error: Not a valid BMP file.\n"); 67 fclose(fp); 68 return 1; 69 } 70 71 printf("\n=== FILE HEADER ===\n"); 72 printf("File Size: %u bytes\n", fileHeader.bfSize); 73 printf("Data Offset: %u bytes\n", fileHeader.bfOffBits); 74 printf("Header Size: %u bytes\n", fileHeader.biSize); 75 76 printf("\n=== BITMAP INFO ===\n"); 77 printf("Width: %d px\n", infoHeader.biWidth); 78 printf("Height: %d px\n", infoHeader.biHeight); 79 printf("Bits per Pixel: %u\n", infoHeader.biBitCount); 80 81 int row_bytes = (infoHeader.biWidth * 3 + 3) & ~3; 82 int width = infoHeader.biWidth; 83 int height = infoHeader.biHeight; 84 int row_padded = (width * sizeof(PIXEL24) + 3) & ~3; 85 86 PIXEL24 *pixels = malloc(row_padded * height); 87 88 fseek(fp, fileHeader.bfOffBits, SEEK_SET); 89 90 for (int y = 0; y < height; y++) { 91 fread((uint8_t*)pixels + y * row_padded, 1, row_padded, fp); 92 } 93 94 printRGB(pixels, width, height, row_padded); 95 96 fclose(fp); 97 return 0; 98} 99
[FILE END]
(C) 2025 0x4248 (C) 2025 4248 Media and 4248 Systems, All part of 0x4248 See LICENCE files for more information. Not all files are by 0x4248 always check Licencing.