![]() |
TOP Link Software/CG About |

#include <stdio.h>
#include <windows.h>
BITMAPFILEHEADER bfh; // (14 bytes)
BITMAPV4HEADER bh; // (108 bytes)
DWORD dsBitfield[3]; // (12 bytes) // from DIBSECTION
int savebmpv4(char *fname,long width,long height,
unsigned char *r,
unsigned char *g,
unsigned char *b,
unsigned char *a) {
FILE *wfsr;
long x,y,adr,outbytes;
int i;
wfsr= fopen(fname,"wb");
if (wfsr==NULL) {
printf("Cannot open writing file: %s\n",fname);
return -1;
}
// BITMAPFILEHEADER bfh; // (14 bytes)
bfh.bfType = 'B'|('M'<<8);
bfh.bfSize = width * height *4
+ sizeof(BITMAPFILEHEADER) + sizeof(BITMAPV4HEADER)
+ sizeof(DWORD)*3;
bfh.bfReserved1 = 0;
bfh.bfReserved2 = 0;
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPV4HEADER)
+ sizeof(DWORD)*3;
outbytes= fwrite( &bfh, 1, sizeof(BITMAPFILEHEADER), wfsr );
if (outbytes<sizeof(BITMAPFILEHEADER)) {
printf("Error outputting file (1): %s\n",fname);
fclose(wfsr); return 1;
}
// BITMAPV4HEADER bh; // (108 bytes)
bh.bV4Size = sizeof(BITMAPV4HEADER);
bh.bV4Width = (width);
bh.bV4Height = (height);
bh.bV4Planes = 1;
bh.bV4BitCount = 32;
bh.bV4V4Compression = BI_BITFIELDS;
bh.bV4SizeImage = 0; // or = width * height *4;
bh.bV4XPelsPerMeter = 0xFF;
bh.bV4YPelsPerMeter = 0xFF;
bh.bV4ClrUsed = 0;
bh.bV4ClrImportant = 0;
bh.bV4RedMask = 0x000000FF;
bh.bV4GreenMask = 0x0000FF00;
bh.bV4BlueMask = 0x00FF0000;
bh.bV4AlphaMask = 0xFF000000;
bh.bV4CSType = LCS_sRGB;
bh.bV4Endpoints.ciexyzRed.ciexyzX = 0; /* N/A */
bh.bV4Endpoints.ciexyzRed.ciexyzY = 0;
bh.bV4Endpoints.ciexyzRed.ciexyzZ = 0;
bh.bV4Endpoints.ciexyzGreen.ciexyzX = 0;
bh.bV4Endpoints.ciexyzGreen.ciexyzY = 0;
bh.bV4Endpoints.ciexyzGreen.ciexyzZ = 0;
bh.bV4Endpoints.ciexyzBlue.ciexyzX = 0;
bh.bV4Endpoints.ciexyzBlue.ciexyzY = 0;
bh.bV4Endpoints.ciexyzBlue.ciexyzZ = 0;
bh.bV4GammaRed = 1; /* N/A */
bh.bV4GammaGreen = 1;
bh.bV4GammaBlue = 1;
/* Those values are N/A, because bV4CSType is not LCS_CALIBRATED_RGB. */
outbytes= fwrite( &bh, 1, sizeof(BITMAPV4HEADER), wfsr );
if (outbytes<sizeof(BITMAPV4HEADER)) {
printf("Error outputting file (2): %s\n",fname);
fclose(wfsr); return 2;
}
// DWORD * 3 // (12 bytes)
dsBitfield[0]= 0x000000FF;
dsBitfield[1]= 0x0000FF00;
dsBitfield[2]= 0x00FF0000;
outbytes= fwrite( dsBitfield, 1, sizeof(DWORD)*3, wfsr );
if (outbytes<(sizeof(DWORD)*3)) {
printf("Error outputting file (3): %s\n",fname);
fclose(wfsr); return 3;
}
// BITMAP data // ((width * height * 4) bytes)
for (y=height-1; y>=0 ;y--) {
adr= y * width;
for (x=0; x<width ;x++) {
fputc( *(r+adr), wfsr ); // Red
fputc( *(g+adr), wfsr ); // Green
fputc( *(b+adr), wfsr ); // Blue
i= fputc( *(a+adr), wfsr ); // Alpha
adr++;
}
if (i==EOF) {
printf("Error outputting file (4): %s\n",fname);
fclose(wfsr); return 4;
}
}
fclose(wfsr);
printf("Saved.\n");
return 0;
}
unsigned char bmpR[96][128]; // 12288 bytes * 4 = 128*96*4
unsigned char bmpG[96][128];
unsigned char bmpB[96][128];
unsigned char bmpA[96][128];
int main() {
long x,y;
float ft;
int i;
// Creating sample image ...
for (y=0; y<96 ;y++) {
for (x=0; x<128 ;x++) {
ft= (x-64)*(x-64)+(y-48)*(y-48)*2;
ft/= 8;
if (ft>255) ft= 255;
bmpR[y][x]= 255-x*2;
bmpG[y][x]= 255-y/3*8;
bmpB[y][x]= x + y/3*4;
bmpA[y][x]= ft;
}
}
i= savebmpv4("testv4.bmp", 128, 96,
&bmpR[0][0], &bmpG[0][0], &bmpB[0][0], &bmpA[0][0] );
if (i) {
printf("BMP save failed. (%d)\n",i);
} else {
printf("BMP save OK.\n");
}
return i;
}
|
| Paint (PaintBrush) | Skymaker | |
| Win 95 |
Windows 95 - PaintBrush![]() 読込みエラーとなります |
Windows 95 - Skymaker![]() |
| Win XP |
Windows XP - Paint![]() 透明度プレーンが無視されます |
Windows XP - Skymaker![]() |