このプログラムについて

[戻る]
美紀 2002/01/08(火) 17:09:49
はじめまして、美紀です。
C言語で以下のプログラムを作ったんですが
ちゃんと動いてくれません。
内容はビットマップのカラー画像をを白と黒だけに分けるプログラムです。
誰かやさしい人この謎を解明してくれませんか?
いろんな本を見たりして作ったので
自分でもわからないところがたくさんあります。

/*
    ☆☆☆☆☆☆☆閾値処理プログラム☆☆☆☆☆☆☆
*/

#include    <stdio.h>
#include    <stdlib.h>
#include    <math.h>        
#include    "Params.h"


int bmp_read(unsigned char *image, char *filename);
void threshold(unsigned char image[Y_SIZE][X_SIZE], 
               unsigned char image2[Y_SIZE][X_SIZE], int thresh, int mode);
int bmp_write(unsigned char *image3, unsigned char image[Y_SIZE][X_SIZE], char *filename);

    FILE    *fp;
    unsigned char image_buf[Y_SIZE][X_SIZE];

void main()
{
    unsigned char image[Y_SIZE][X_SIZE];
    unsigned char image2[Y_SIZE][X_SIZE];
    unsigned char image3[Y_SIZE][X_SIZE];
    char *fn;
    int    sikii = 148, mode = 1, read, write;

    printf("始まります\n");
    fn = "Matu10h.bmp";

    read = bmp_read(*image, fn);
    threshold(image, image2, sikii, mode);
    printf("閾値処理終了\n");
    write = bmp_write(*image3, image2, fn);
    printf("描写終了\n");
    printf("終わります\n");
}

/*---bmp_read---BMP形式のカラー画像をディスクから読み込む------
    image:        カラー画像配列
    xsize:        画像横サイズ
    ysize:        画像縦サイズ
    filename:    ファイル名(.bmp)
-------------------------------------------------------------*/
int bmp_read(unsigned char *image, char *filename)
{
    printf("読込中\n");

    int i, j;
    unsigned char header[54];
    
    fp = fopen("Matu10h.bmp", "rb");
    if(fp == NULL) {
        printf("開かない\n");
        return -1;}
    else
        printf("開けた\n");

    fread(header, sizeof(unsigned char), 54, fp);
    fread(image_buf, sizeof(unsigned char), (size_t)(long)X_SIZE*Y_SIZE*3, fp);
    fclose(fp);
    
    printf("for文開始1\n");

    for(i = 0; i < Y_SIZE; i++) {
        for(j = 0; j < X_SIZE; j++) {
            *(image + X_SIZE*(Y_SIZE-i-1) + j)
                = (image_buf[i][j] + 3*(X_SIZE*i + j) + 2);
            *(image + X_SIZE*(Y_SIZE-i-1) + j)
                = (image_buf[i][j] + 3*(X_SIZE*i + j) + 1);
            *(image + X_SIZE*(Y_SIZE-i-1) + j)
                = (image_buf[i][j] + 3*(X_SIZE*i + j)    );
        }
    }
    printf("for文終了\n");
    printf("読込終了\n");
    return 0;
}


/*---threshold---閾値処理-----------------
    image_in:    入力画像配列
    image_out:    出力画像配列
    thresh:        閾値
    mode:        閾値処理の方法(1,2)
----------------------------------------*/
void threshold(unsigned char image[Y_SIZE][X_SIZE],
               unsigned char image2[Y_SIZE][X_SIZE], int thresh, int mode)
{
    printf("閾値処理開始\n");
    int i,j;

    for (i=0; i<Y_SIZE; i++){
        for (j=0; j<X_SIZE; j++){
    //    printf("b=%d ",image_out[i][j]);
            switch (mode){
            case 2:
                if ((unsigned char)image[i][j]<=thresh) image2[i][j]=HIGH;
                else                                    image2[i][j]=LOW;
                break;
            default:
                if ((unsigned char)image[i][j]>=thresh) image2[i][j]=HIGH;
                else                                    image2[i][j]=LOW;
                break;
            }
        }
    }
    printf("%d\n", image2[305][480]);
}

/*---bmp_write---カラー画像をディスクにBMP形式で書き出す-------
    image:        カラー画像配列
    xsize:        画像横サイズ
    ysize:        画像縦サイズ
    filename:    ファイル名(.bmp)
-------------------------------------------------------------*/
int bmp_write(unsigned char *image3, unsigned char image2[Y_SIZE][X_SIZE],  char *filename)
{
    printf("描写中\n");
    int i, j;
    long file_size, width, height;
    unsigned char header[54] = {0x42, 0x4d, 0, 0, 0, 0, 0, 0, 0, 0,
        54, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 24, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0};
    printf("宣言終了\n");

    file_size = X_SIZE * Y_SIZE * 3 + 54;
    header[2] = (unsigned char)(file_size & 0x000000ff);
    header[3] = (file_size >> 8) & 0x000000ff;
    header[4] = (file_size >> 16) & 0x000000ff;
    header[5] = (file_size >> 24) & 0x000000ff;
    width = X_SIZE;
    header[18] = width & 0x000000ff;
    header[19] = (width >> 8) & 0x000000ff;
    header[20] = (width >> 16) & 0x000000ff;
    header[21] = (width >> 24) & 0x000000ff;
    height = Y_SIZE;
    header[22] = width & 0x000000ff;
    header[23] = (height >> 8) & 0x000000ff;
    header[24] = (height >> 16) & 0x000000ff;
    header[25] = (height >> 24) & 0x000000ff;
    printf("ファイルサイズ終了\n");
    
    
    printf("for文開始2\n");
    for(i = 0; i < Y_SIZE; i++){
        for(j = 0; j < X_SIZE; j++){
            *(image3 + 3*(X_SIZE*i + j)     )
                = (image2[i][j] + X_SIZE*(Y_SIZE-i-1) + j + (unsigned char)X_SIZE*Y_SIZE*2);
            *(image3 + 3*(X_SIZE*i + j)  + 1)
                = (image2[i][j] + X_SIZE*(Y_SIZE-i-1) + j + (unsigned char)X_SIZE*Y_SIZE  );
            *(image3 + 3*(X_SIZE*i + j)  + 2)
                = (image2[i][j] + X_SIZE*(Y_SIZE-i-1) + j                                  );
        }
    }
    printf("for文終了\n");

    if ((fp = fopen("syorigo.bmp", "wb")) ==NULL) return-1;
    fwrite(header, sizeof(unsigned char)X_SIZE*Y_SIZE, 54, fp);
    fwrite(image3, sizeof(unsigned char)X_SIZE*Y_SIZE, (size_t)(unsigned char)X_SIZE*Y_SIZE*3, fp);
    fclose(fp);

    printf("書込み終了\n");
    return 0;
}

Params.hの中身です。
#define X_SIZE 480    /*画像の横方向の大きさ*/
#define Y_SIZE 305    /*画像の縦方向の大きさ*/
#define X_EXP   9    /*X_EXP = log2(X_SIZE)*/
#define Y_EXP   9    /*Y_EXP = log2(Y_SIZE)*/
#define HIGH   255    /*2値画像のハイ・レベル*/
#define LOW     0    /*2値画像のロー・レベル*/    

よろしくお願いします。本当に困ってます。

2002/01/08(火) 17:14:00
> C言語で以下のプログラムを作ったんですが
> ちゃんと動いてくれません。
どのように、うまく動かないんですか?

というか、こんな聞き方では誰もまともな回答は出さないと思いますが。

toru [E-Mail] 2002/01/08(火) 17:25:51
全く見当違いだったらすみません。まず...

> read = bmp_read(*image, fn);
→ read = bmp_read(image, fn);

> write = bmp_write(*image3, image2, fn);
→ write = bmp_write(image3, image2, fn);

> for(i = 0; i < Y_SIZE; i++) {
>     for(j = 0; j < X_SIZE; j++) {
>         *(image + X_SIZE*(Y_SIZE-i-1) + j)
>             = (image_buf[i][j] + 3*(X_SIZE*i + j) + 2);
>         *(image + X_SIZE*(Y_SIZE-i-1) + j)
>             = (image_buf[i][j] + 3*(X_SIZE*i + j) + 1);
>         *(image + X_SIZE*(Y_SIZE-i-1) + j)
>             = (image_buf[i][j] + 3*(X_SIZE*i + j)    );
>     }
> }
→ 全て代入先が*(image + X_SIZE*(Y_SIZE-i-1) + j)なんで上の2つが意味無いと思うんですが。

masa 2002/01/08(火) 17:25:54
冷たいようですが、自分でもよくわかっていないプログラムを
人に解読させるのですか?それでは、あなた自身のためになら
ないのでは無いでしょうか。仮に心優しい人がいて、その人が
わかったとしても、あなたにはわからないと思いますよ。
自分で、こつこつ動きを調べていかないと、自分でプログラムを
作ることなど絶対にできないと思います。まずは自分で頑張って
みてどこが解らないのかをよく考えてみてはいかがでしょうか。

anon 2002/01/08(火) 21:16:07
女性の名前で投稿すれば答えて貰えるなんて甘い!
最近そういう人が増えてるってどっかの掲示板に書いてました。
・・・私もそう思う。

うんこ 2002/01/09(水) 10:18:28
んなのわかるわけないじゃん
自分で考えろっつーの!!

美紀 2002/01/09(水) 10:26:27
皆さんお返事ありがとうございます。
皆さんの言う通りだと思います。
反省してます。
このプログラムでもう2、3ヶ月悩んでいるんです。
プレビュー画面では、真っ黒になってるんですが、
開くと真っ白になってるんです。
何となくなんですけどプログラムも理解はしてます。
いまもがんばっています。誰か助けてくれると
幸いです。

EIJI 2002/01/09(水) 14:11:48
とりあえず、バッファが小さすぎて全部読めていません。

2002/01/09(水) 15:28:02
> プレビュー画面では、真っ黒になってるんですが、
> 開くと真っ白になってるんです。

プレビュー画面てなんですか?

てゆーか、デバックってしてます?
「どこまで上手くいって、どこから動作しない」とか問題の切り分けやってます?
「とりあえず作って実行してみたけど上手くいかない」だと解決は無理と思いますけど。

美紀 2002/01/09(水) 17:10:56
デバックをして実行してます。
実行した後に、元々あるビットマップが
白と黒だけのビットマップになっていれば
いいんですけど、ならないんです。
その元々のビットマップが入ってるフォルダを開いて
その絵をクリックするとプレビューが
小さく出るじゃないですか?
その画面では黒くなってるんです。
でもそのビットマップを開くと、
真っ白になってるんです。

toru 2002/01/09(水) 17:30:37
それって、IEでは表示できて、ペイントでは無理ってことですか?
かなり昔のことなんで薄っすらとしか憶えて無いですけど
ビットデータをDWORD単位に合わせないとそういう症状が出たような気がしました。

それとヘッダの部分も怪しい気がします。
↑これに関してはヘッダの定義部分が読みづらいんで読んでません。

それと

BITMAPFILEHEADERと
BITMAPINFOHEADERを使ったほうがわかりやすいです。

2002/01/09(水) 17:33:43
プレビューについてはわかりました。

でもデバックの進め方がおかしいような気がします。
プログラムの段階として、
1.ビットマップファイル読みこみ
2.ビットマップ加工
3.ビットマップをファイルに書きこみ
ってやってると思いますが、1と3のみ実施した場合
問題なく同一のビットマップのファイルはできてますか?

問題の切り分けってそういうことです。

プログラム全部出して「これ直して」では見るほうも大変だって事を
知ってください。

TAKA 2002/01/09(水) 17:39:53
はじめまして

いろいろしているみたいですが、まずbmpファイルの形式があっているか調べた方がいいとおもいます。
カラー情報等で、ヘッダがずれていたりしていませんか?
bmpファイルの種類はいろいろあります。
一度そのファイルをの中身を全てバイナリ−エディタ等で確認してみよう。
toruさんの意見も反映しなければなりませんね。

美紀 2002/01/10(木) 17:13:02
またたくさんのお返事ありがとうございます。
皆さんのお返事本当にうれしいのですが、
自分がなにせ初心者なもので、
皆さんの意見がときどき理解できていません。
とりあえず、皆さんの意見を参考に
bmpを開いて新しい名前で保存するという
プログラムを作ってみましたが、
デバックの途中で強制終了がかかってしまいます。
多分皆さんのおっしゃるとおりバッファの部分が
おかしいのだと自分でも思うのですが、
よくわかりません。厳しい意見でもかまいません
何か返事を書いてくれるとうれしいです。

通りすがり 2002/01/10(木) 17:47:41
とりあえず、新しく作ったプログラムのソースコードを
のっけて、その処理のどこで強制終了になるのかを
記載してみるのがよろしいかと思われますが・・・。

toru [E-Mail] 2002/01/11(金) 00:24:26
WIDTHが480で24BITの場合は↓こんな感じ。

unsigned char image[Y_SIZE][X_SIZE * 3];

2002/01/11(金) 09:34:17
> 自分がなにせ初心者なもので、
> 皆さんの意見がときどき理解できていません。

わからないなら、質問しましょう。
「初心者」を言い訳材料にしても意味ないです。

美紀 2002/01/11(金) 14:34:34
そうですね。んさんの言う通りですね。
BITMAPFILEHEADERとBITMAPINFOHEADER
ってなんですか?BMPフォーマット関係のこと
というのはわかるのですが、深いところはわかりません。

TAKA 2002/01/11(金) 14:41:05
ネット上のBITMAPについて
長いですが呼んでみてください。

ビットマップファイルについて
Windowsでは,3.0のころから,ビットマップという画像形式が標準で使用されています.Windowsに付属のペイントブラシなどで作成でき,現在ほとんどのグラフィックソフトが出力することができます.
このビットマップファイルは,2色,4色,16色,256色,フルカラーのデータを扱うことができ,圧縮がされていないため,サイズは大きいが,比較的簡単に扱うことのできるファイル形式です.(注:256色には,RLE形式という圧縮形式もあります.)
ここでは,ゲームなどに使用するのに便利な,256色のカラーテーブル付きのビットマップについて説明していきます.このカラーテーブル付きのビットマップのことを,DIB(Device Independent Bitmap:デバイス独立ビットマップ)と呼びます.つまり,カラーテーブルを持っているので,どんなデバイスにも出力できる形式です. (デバイス依存ビットマップは,システムカラーを使ったりするので,デバイスによってパレット値が変わってしまいます.)
さらに,DIBには,bottom-upDIBと,top-downDIBの二種類があります.通常,ファイルに保存されているビットマップは,bottom-upDIBです.これは,実際のイメージが,上下逆さまに格納されている形式です.最近は,あまり使われていませんが,WinGなどで転送速度の最適化をする場合には,top-downDIBというのを使用します.これは,イメージの上下の向きがそのままで格納されている形式です.

DIBの構造
ここからは,bottom-upDIBについて説明していきます.(基本的には,top-downDIBも同じ構造で,高さがマイナスになっています.)表1にDIBの構造を示します.
ヘッダ部 
カラーテーブル 
ビットデータ 
表1.DIBの構造

さらに,ヘッダ部は,次の2つのヘッダに別れています.(表2)

ファイル情報 BITMAPFILEHEADER構造体 
DIBのヘッダ BITMAPINFOHEADER構造体 
表2.ヘッダ

これらの構造体を以下に示します.


typedef struct tagBITMAPFILEHEADER {
        WORD    bfType;
        DWORD   bfSize;
        WORD    bfReserved1;
        WORD    bfReserved2;
        DWORD   bfOffBits;
} BITMAPFILEHEADER;

bfType ビットマップファイルの印「BM」を格納します. 
bfSize ファイルのサイズを指定します. 
bfReserved1,bfReserved2 予約されています.0が入ります. 
bfOffbits ビットデータの先頭までのオフセットです. 
表3.BITMAPFILEHEADER構造体


typedef struct tagBITMAPINFOHEADER{
   DWORD  biSize;
   LONG   biWidth;
   LONG   biHeight;
   WORD   biPlanes;
   WORD   biBitCount
   DWORD  biCompression;
   DWORD  biSizeImage;
   LONG   biXPelsPerMeter;
   LONG   biYPelsPerMeter;
   DWORD  biClrUsed;
   DWORD  biClrImportant;
} BITMAPINFOHEADER;

biSize sizeof(BITMAPINFOHEADER) 
biWidth ビットマップの幅です. 
biHeight ビットマップの高さです. 
biPlanes プレーン数です.通常1です. 
biBitCount 1ピクセルあたりのビット数です.256色の場合8です. 
biCompression DIBでは,非圧縮なので0です. 
biSizeImage イメージのサイズです.DIBでは,0を指定します. 
biXPelsPerMeter,biYPelsPerMeter DIBでは,0を指定します. 
biClrUsed カラーテーブルを持っている場合,0またはそのサイズを示します. 
biClrImportant 重要なカラーインデックス値を示します.通常0(全ての色)です. 
表4.BITMAPINFOHEADER構造体

実際にファイルから読み込んで,メモリに保存する場合は,BITMAPINFOHEADER構造体以下を保存し,BITMAPINFOHEADER構造体へのポインタを保持するようにします.

次に,カラーテーブルです.

カラーテーブルは,RGBQUAD構造体の配列になっています.256色のビットマップの場合には,256色分のRGBQUAD構造体があります.次にRGBQUAD構造体を示します.


typedef struct tagRGBQUAD {
    BYTE    rgbBlue;
    BYTE    rgbGreen;
    BYTE    rgbRed;
    BYTE    rgbReserved;
} RGBQUAD;

ここには,それぞれの色のRGB値を指定します.必ず,256色分のデータが連続して格納される必要があります.

これに続いて,実際のビットデータが格納されています.256色DIBでは,1ピクセルあたり,8ビットすなわち,1ピクセルあたり1バイトのデータとして格納されています.このビットデータの値は,カラーテーブルで示されるパレット番号になります.実際の色を知る場合には,カラーテーブルを参照します.

ビットデータは,bottom-upDIBの場合,一番下の水平走査線の左から順に格納されています.上下が逆に格納されており,下のラインから,上のラインへという順になります.

ここで注意するべきは,水平走査線のサイズは,必ず,32ビット境界にそろえる必要があるということです.つまり,256色の場合,幅が4の倍数ではないときには,4の倍数になるように足りない分のビットを追加する必要があります.この追加されたデータは,0にする必要があり,この部分は表示してはいけません.


ビットマップの読み込み
DIBをファイルからメモリ上に読み込む方法について説明します.基本的には,ファイルのヘッダを読み込んで,それに基づいてヘッダ部と,カラーテーブル,ビットデータを読み込んで,メモリに格納します.
それでは,順に説明していきます.
まず,ファイルを開いて,ファイルのハンドルを取得します.


HANDLE hFile;
hFile = CreateFile(szBitmapFile,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL);

szBitmapFileには,ファイル名が入っています.ファイルが見付からない場合にはオープンしないので,hFileの値をチェックする必要があります.

次に,オープンできたら,ファイルヘッダを読み込みます.


BITMAPFILEHEADER bmHead;
DWORD d;

SetFilePointer(hFile,0,NULL,FILE_BEGIN);

/*ヘッダ部読み込み*/
ReadFile(hFile,&bmHead,sizeof(BITMAPFILEHEADER),&d,NULL);

ここで,ビットマップファイルであることを,bfTypeメンバから確認します.ビットマップであれば,ヘッダ部以降を読み込みます.ここで読み込む前にDIBの大きさや,色数などを知りたい場合は,ヘッダ部を仮に読み込んでおくと良いでしょう.ここでは,どんな場合でも読み込んでしまう方法(色数が何色でも読み込める方法)で説明します.次のように残りのデータを読み込みます.


LPBITMAPINFOHEADER pDib;

pDib = (LPBITMAPINFOHEADER)GlobalAlloc(GPTR,(bmHead.bfSize - sizeof(BITMAPFILEHEADER)) );
ReadFile(hFile,pDib,(bmHead.bfSize - sizeof(BITMAPFILEHEADER)),&d,NULL);

ここでは,ファイルヘッダのbfSizeメンバからファイルヘッダのサイズを引いたサイズの領域をメモリ上に確保し,その領域に,現在のファイルポインタの位置から,そのサイズだけデータを読み込んでいます.
以上で,DIBをメモリ上にロードできました.もちろん,


CloseHandle(hFile);

をお忘れなく.

以降は,ここで確保したメモリ領域のポインタ,pDibの値を使用してビットマップを表示したり,内容を編集したりします.


ビットマップを表示する
読み込みが完了したら,せっかくなので表示してみましょう.
DIBを表示するには,StretchDIBits関数を使用します. hWndで示されるウィンドウにDIBを表示するには,次のようにします.


HDC hdc;
BYTE *pBits;

pBits = (BYTE *)((RGBQUAD *)(pDib + 1) + 256);
hdc = GetDC(hWnd);
StretchDIBits(hdc,0,0,pDib->biWidth,pDib->biHeight,
              0,0,pDib->biWidth,pDib->biHeight,
              pBits,(BITMAPINFO *)pDib,DIB_RGB_COLORS,SRCCOPY);
ReleaseDC(hWnd,hdc);

pBitsは,DIBのビットデータの先頭へのポインタです.これを求めるのには,マクロを作っておくと便利でしょう.StretchDIBits関数は,パレットを最適化して表示してくれるので,ディスプレーの色数よりも大きな色数の絵を表示しようとしても,自動的にディザをかけてくれるので,表示ができます.しかし,その反面,256色のDIBの場合でも,最適なパレットを探すという処理をウィンドウズが行ってしまうためあまり高速な処理には適しません.また,256色環境で256色のDIBを表示する場合にも,ディザがかかってしまい,意図する絵ではなくなってしまいます.この場合は,パレットを設定してデバイスコンテクストに選択する必要があります.パレットについては他の章で詳しく説明します.

また,DIBを高速に表示したい場合は,CreateDIBSectionを使うとある程度高速になります.CreateDIBSectionは,Windows3.1で,WinGと呼ばれていたものと,ほぼ同じもので,ビットマップへのメモリDCを提供するものです.CreateDIBSectionについては,別ページで詳しく説明します.

TAKA 2002/01/11(金) 15:06:18
上記に基づいて簡単なグレーのスケールのファイル作成ロジックです。
まあ、参考程度に見てください。
簡単につくったんで雑で申し訳ないです。

    char *wk;
    long len, len1, len2, len3, len4;
    FILE *fp;

    BITMAPFILEHEADER    b_map_h;
    BITMAPINFOHEADER    b_map_i;
    RGBQUAD                rgb[256];
    char                ptn[256][256];

    len1 = sizeof(b_map_h);            // BITMAPFILEHEADERサイズ
    len2 = sizeof(b_map_i);            // BITMAPINFOHEADERサイズ
    len3 = sizeof(rgb);                // カラー情報今回256
    len4 = sizeof(ptn);                // データサイズ今回256*256

    len = len1 + len2 + len3 + len4;    // ファイルサイズ

    wk = (char *)&b_map_h;        // ヘッダ作成部
    memset(wk,0x00,len1);

    wk[0] = 'B';                            // 固定
    wk[1] = 'M';                            // 固定
    b_map_h.bfSize = len;                    // ファイルサイズ
    b_map_h.bfOffBits = len1 + len2 + len3;    //データまでのオフセットセット

    wk = (char *)&b_map_i;        // 情報作成部
    memset(wk,0x00,len2);

    b_map_i.biSize = len2;
    b_map_i.biWidth = 256;
    b_map_i.biHeight = 256;
    b_map_i.biPlanes = 1;
    b_map_i.biBitCount = 8;
    b_map_i.biCompression = 0;
    b_map_i.biSizeImage = 0;
    b_map_i.biXPelsPerMeter = 0;
    b_map_i.biYPelsPerMeter = 0;
    b_map_i.biClrUsed = 0;
    b_map_i.biClrImportant = 0;

    wk = (char *)&rgb[0];
    memset(wk,0x00,len3);

    // 今回はグレーのグラデーションでつくるカラーをセット
    int i,j,k;
    for (i = 0; i < 256; i++) {
        j = i / 8;
        j *= 8;
        rgb[i].rgbBlue = j;
        rgb[i].rgbGreen = j;
        rgb[i].rgbRed = j;
    }


    // データをカラーパレットに沿ってセット
    wk = (char *)&ptn[0][0];
    memset(wk,0x00,len4);
    for (i = 0; i < 256; i++) {
        k = i / 2;
        k = k * 2;
        for (j = 0; j < 256; j++) {
            ptn[j][i] = k;
        }
    }


    // ファイル用データエリア確保
    wk = new char[len];

    memcpy(&wk[0],(void *)&b_map_h,len1);                        // ヘッダセット
    memcpy(&wk[len1],(void *)&b_map_i,len2);                    // 情報セット
    memcpy(&wk[len1 + len2],(void *)&rgb[0],len3);                // パレットセット
    memcpy(&wk[len1 + len2 + len3],(void *)&ptn[0][0],len4);    // データセット

    fp = fopen( "test2.bmp", "wb+" );
    fwrite(wk,1,len,fp);
    fclose(fp);

    if (wk != NULL) {
        delete [] wk;
    }

EIJI 2002/01/11(金) 16:48:45
>TAKAさん
ページまるごとコピペじゃなくてURLを示したほうが良いのでは?
そのほうが読みやすいし。
もしまったくの他人のページだと問題になりかねないし。

TAKA 2002/01/11(金) 17:10:10
EIJIさんへ
すみませんそのとおりですね。
今後、気をつけます。

美紀 2002/02/12(火) 10:52:45
[[解決]]
TAKAさんありがとうございます。
おかげで自分の作りたかった物が出来ました。
しばらくインターネットをしてなかったので、
返事が遅れてすいませんでした。
TAKAさん以外の人たちも、
本当にありがとうございました。
また困ったときはよろしくお願いします。

古いスレッドには追加発言できません。