#1
by 24736 » 5年前
bmpファイルの入出力(+画像の色変換)をしたいです。
ファイルは出力されるものの、出力されたファイルが破損しているらしく開くことができません。
エラー等も出ないのでどこを直せばいいのか分かりません。
プログラミングを始めたばかりで理解が追い付いていないためおかしな点が多々あると思いますが、どうか教えていただければと思います。
以下コードです。
コード:
#include<stdio.h>
#include<stdlib.h>
typedef struct {
unsigned short bfType;
unsigned long bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned long bfOffBits;
} BITMAPFILEHEADER;
typedef struct {
unsigned long biSize;
long biWidth;
long biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned long biCompression;
unsigned long biSizeImage;
long biXPixPerMeter;
long biYPixPerMeter;
unsigned long biClrUsed;
unsigned long biClrImportant;
} BITMAPINFOHEADER;
typedef struct {
unsigned char rgbBlue;
unsigned char rgbGreen;
unsigned char rgbRed;
unsigned char rgbReserved;
} RGBQUAD;
typedef struct {
BITMAPFILEHEADER bitmapFileHeader;
BITMAPINFOHEADER bitmapInfoHeader;
RGBQUAD rgbQuad[256];
unsigned char *imageData;
} BMPINFO;
int readBMP(char* filename, BMPINFO* bmpInfo);
int writeBMP(char* filename, BMPINFO* bmpInfo);
int readBMP(char* filename, BMPINFO* bmpInfo) {
FILE *fp;
if ((fopen_s(&fp, filename, "rb")) != 0)
printf("ファイルを開けませんでした\n");
return -1;
// BITMAPFILEHEADER/bfType読み込み
fread_s(&bmpInfo->bitmapFileHeader.bfType, sizeof(unsigned short), sizeof(unsigned short), 1, fp);
// BMPであることを確認
if (bmpInfo->bitmapFileHeader.bfType != 0x4d42)
return -2;
// その他情報を読み込む
fread_s(&bmpInfo->bitmapFileHeader.bfSize, sizeof(unsigned long), sizeof(unsigned long), 1, fp); // bfSize
fread_s(&bmpInfo->bitmapFileHeader.bfReserved1, sizeof(unsigned short), sizeof(unsigned short), 1, fp); // bfReserved1
fread_s(&bmpInfo->bitmapFileHeader.bfReserved2, sizeof(unsigned short), sizeof(unsigned short), 1, fp); // bfReserved2
fread_s(&bmpInfo->bitmapFileHeader.bfOffBits, sizeof(unsigned long), sizeof(unsigned long), 1, fp); // bfOffBits
// BITMAPINFOHEADER読み込み
fread_s(&bmpInfo->bitmapInfoHeader, sizeof(BITMAPINFOHEADER), sizeof(BITMAPINFOHEADER), 1, fp);
// BMPINFOHEADERの種類を確認
long test = bmpInfo->bitmapInfoHeader.biSize;
if (bmpInfo->bitmapInfoHeader.biSize != 40)
return -3;
// カラーテーブル取得
fread_s(&bmpInfo->rgbQuad, sizeof(RGBQUAD) * 256, sizeof(RGBQUAD), 256, fp);
// 画像データ格納用領域確保
bmpInfo->imageData = (char*)malloc(sizeof(char) * bmpInfo->bitmapInfoHeader.biWidth * bmpInfo->bitmapInfoHeader.biHeight);
// 画像データ取得
fread_s(&bmpInfo->imageData,
bmpInfo->bitmapInfoHeader.biWidth * bmpInfo->bitmapInfoHeader.biHeight,
sizeof(char),
bmpInfo->bitmapInfoHeader.biWidth * bmpInfo->bitmapInfoHeader.biHeight,
fp);
fclose(fp);
return 0;
}
int writeBMP(char* filename, BMPINFO* bmpInfo){
FILE *fp;
if ((fopen_s(&fp, filename, "w+b")) != 0)
return -1;
// BMPファイル書き出し
fwrite(&bmpInfo->bitmapFileHeader.bfType, sizeof(unsigned short), 1, fp);
fwrite(&bmpInfo->bitmapFileHeader.bfSize, sizeof(unsigned long), 1, fp);
fwrite(&bmpInfo->bitmapFileHeader.bfReserved1, sizeof(unsigned short), 1, fp);
fwrite(&bmpInfo->bitmapFileHeader.bfReserved2, sizeof(unsigned short), 1, fp);
fwrite(&bmpInfo->bitmapFileHeader.bfOffBits, sizeof(unsigned long), 1, fp);
fwrite(&bmpInfo->bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, fp);
fwrite(&bmpInfo->rgbQuad, sizeof(RGBQUAD), 256, fp);
fwrite(&bmpInfo->imageData,
sizeof(unsigned char),
bmpInfo->bitmapInfoHeader.biWidth * bmpInfo->bitmapInfoHeader.biHeight,
fp);
fclose(fp);
return 0;
}
int main() {
char rFilename[64] = "test.bmp";
char wFilenmane[64] = "test_.bmp";
BMPINFO bitmapInfo;
readBMP(rFilename, &bitmapInfo);
writeBMP(wFilenmane, &bitmapInfo);
return 0;
}
bmpファイルの入出力(+画像の色変換)をしたいです。
ファイルは出力されるものの、出力されたファイルが破損しているらしく開くことができません。
エラー等も出ないのでどこを直せばいいのか分かりません。
プログラミングを始めたばかりで理解が追い付いていないためおかしな点が多々あると思いますが、どうか教えていただければと思います。
以下コードです。
[code]
#include<stdio.h>
#include<stdlib.h>
typedef struct {
unsigned short bfType;
unsigned long bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned long bfOffBits;
} BITMAPFILEHEADER;
typedef struct {
unsigned long biSize;
long biWidth;
long biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned long biCompression;
unsigned long biSizeImage;
long biXPixPerMeter;
long biYPixPerMeter;
unsigned long biClrUsed;
unsigned long biClrImportant;
} BITMAPINFOHEADER;
typedef struct {
unsigned char rgbBlue;
unsigned char rgbGreen;
unsigned char rgbRed;
unsigned char rgbReserved;
} RGBQUAD;
typedef struct {
BITMAPFILEHEADER bitmapFileHeader;
BITMAPINFOHEADER bitmapInfoHeader;
RGBQUAD rgbQuad[256];
unsigned char *imageData;
} BMPINFO;
int readBMP(char* filename, BMPINFO* bmpInfo);
int writeBMP(char* filename, BMPINFO* bmpInfo);
int readBMP(char* filename, BMPINFO* bmpInfo) {
FILE *fp;
if ((fopen_s(&fp, filename, "rb")) != 0)
printf("ファイルを開けませんでした\n");
return -1;
// BITMAPFILEHEADER/bfType読み込み
fread_s(&bmpInfo->bitmapFileHeader.bfType, sizeof(unsigned short), sizeof(unsigned short), 1, fp);
// BMPであることを確認
if (bmpInfo->bitmapFileHeader.bfType != 0x4d42)
return -2;
// その他情報を読み込む
fread_s(&bmpInfo->bitmapFileHeader.bfSize, sizeof(unsigned long), sizeof(unsigned long), 1, fp); // bfSize
fread_s(&bmpInfo->bitmapFileHeader.bfReserved1, sizeof(unsigned short), sizeof(unsigned short), 1, fp); // bfReserved1
fread_s(&bmpInfo->bitmapFileHeader.bfReserved2, sizeof(unsigned short), sizeof(unsigned short), 1, fp); // bfReserved2
fread_s(&bmpInfo->bitmapFileHeader.bfOffBits, sizeof(unsigned long), sizeof(unsigned long), 1, fp); // bfOffBits
// BITMAPINFOHEADER読み込み
fread_s(&bmpInfo->bitmapInfoHeader, sizeof(BITMAPINFOHEADER), sizeof(BITMAPINFOHEADER), 1, fp);
// BMPINFOHEADERの種類を確認
long test = bmpInfo->bitmapInfoHeader.biSize;
if (bmpInfo->bitmapInfoHeader.biSize != 40)
return -3;
// カラーテーブル取得
fread_s(&bmpInfo->rgbQuad, sizeof(RGBQUAD) * 256, sizeof(RGBQUAD), 256, fp);
// 画像データ格納用領域確保
bmpInfo->imageData = (char*)malloc(sizeof(char) * bmpInfo->bitmapInfoHeader.biWidth * bmpInfo->bitmapInfoHeader.biHeight);
// 画像データ取得
fread_s(&bmpInfo->imageData,
bmpInfo->bitmapInfoHeader.biWidth * bmpInfo->bitmapInfoHeader.biHeight,
sizeof(char),
bmpInfo->bitmapInfoHeader.biWidth * bmpInfo->bitmapInfoHeader.biHeight,
fp);
fclose(fp);
return 0;
}
int writeBMP(char* filename, BMPINFO* bmpInfo){
FILE *fp;
if ((fopen_s(&fp, filename, "w+b")) != 0)
return -1;
// BMPファイル書き出し
fwrite(&bmpInfo->bitmapFileHeader.bfType, sizeof(unsigned short), 1, fp);
fwrite(&bmpInfo->bitmapFileHeader.bfSize, sizeof(unsigned long), 1, fp);
fwrite(&bmpInfo->bitmapFileHeader.bfReserved1, sizeof(unsigned short), 1, fp);
fwrite(&bmpInfo->bitmapFileHeader.bfReserved2, sizeof(unsigned short), 1, fp);
fwrite(&bmpInfo->bitmapFileHeader.bfOffBits, sizeof(unsigned long), 1, fp);
fwrite(&bmpInfo->bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, fp);
fwrite(&bmpInfo->rgbQuad, sizeof(RGBQUAD), 256, fp);
fwrite(&bmpInfo->imageData,
sizeof(unsigned char),
bmpInfo->bitmapInfoHeader.biWidth * bmpInfo->bitmapInfoHeader.biHeight,
fp);
fclose(fp);
return 0;
}
int main() {
char rFilename[64] = "test.bmp";
char wFilenmane[64] = "test_.bmp";
BMPINFO bitmapInfo;
readBMP(rFilename, &bitmapInfo);
writeBMP(wFilenmane, &bitmapInfo);
return 0;
}
[/code]