I made a test program that generates variable size bmp images. When I generate images with widths under 11 or so the images have weird colors in them at the top.
/*
Create 24 bit Bitmap image.
Date: 16 oct 2014
Version: 1
Error: Weird colors when making images smaller than ~11 pixels wide.
*/
#include <stdio.h>
/* Write little-endian 32 bit value to file. */
void fputlong(int val, FILE *fp){
fputc((char)(val & 0xFF), fp);
fputc((char)((val >> 8 )& 0xFF), fp);
fputc((char)((val >> 16) & 0xFF), fp);
fputc((char)(val >> 24), fp);
}
/*
argv[1] = char *src;
argv[2] = char *dst;
*/
int main (int argc, char *argv[]) {
FILE *dst;
int ch, padding, xx, yy, w, h;
char red, green, blue;
/* Verify user input */
if (argc < 4) {
printf("Error: ");
}
switch (argc) {
case 0:
case 1: printf("Missing filename");
break;
case 2: printf("Missing image width");
break;
case 3: printf("Missing image height");
break;
case 4: printf("Missing RED color value");
break;
case 5: printf("Missing GREEN color value");
break;
case 6: printf("Missing BLUE color value");
}
if (argc < 4) {
printf("\nUsage: bmptest file.bmp width height r(0-255) g(0-255) b(0-255)\n");
return 0;
}
w = atoi(argv[2]);
h = atoi(argv[3]);
red = (char)atoi(argv[4]);
green = (char)atoi(argv[5]);
blue = (char)atoi(argv[6]);
dst = fopen(argv[1], "wb+");
/* Write file header */
fputc('B', dst); // File identifier
fputc('M', dst); //
padding = (4 - ((w * 3) % 4))% 4;
fputlong(w * h * 3 + 50 + (padding * h), dst); // Filesize
fputlong(0x00, dst); // Reserved 4 bytes.
fputlong(0x036, dst); // Offset
fputlong((int)40,dst);
fputlong(w, dst); // Width of bitmap
fputlong(h, dst); // Height of bitmap
fputc(0x01, dst); // Number of color planes
fputc(0x00, dst);
fputc(24, dst); // Number of bits per pixel
fputc(0x00, dst);
fputlong(0x00, dst); // Compression method: none
fputlong(0x00, dst); // Image size. Dummy 0
fputlong(0x2700, dst); // Horizontal resolution
fputlong(0x2700, dst); // Vertical resolution
fputlong(0x00, dst); // Number of colors in palette (Default 2^n)
fputlong(0x00, dst); // All colors are equally important
for (yy = 0; yy < h; yy ++) {
for (xx = 0; xx < w; xx ++) {
fputc(blue, dst);
fputc(green, dst);
fputc(red, dst);
}
for (xx = 0; xx < padding; xx ++) {
fputc(0x00, dst);
}
}
printf("Padding = %d; Filesize = %d\n", padding , w * h * 3 + 50 + (padding * h));
fclose(dst);
return 0;
}
Is this a problem with my code or with the decoder?
My bad. Padding should be at the end of every row of pixels >.<