掲示板ランキング  プラスター(インドメタシン配合)  プラスター(伸縮タイプ)


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.7299

windowsプログラム
投稿者---ko(2007/04/03 21:25:06)


すいませんwindowsのプログラムです。

WIDTH_BYTE =
4 * ((bmpCoreHeader.bcWidth * mpCoreHeader.bcBitCount + 31)/ 32);

なぜ4を掛け 31を足し、32で割るのか教えてください

setPixelの部分で、iCountに1や2をなぜ足すのか教えてください。

iCount+=3の意味も教えてください
お願いします。




#include <windows.h>

BITMAPFILEHEADER bmpFileHeader;
BITMAPCOREHEADER bmpCoreHeader;
char * chPixelBit;

LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
    HDC hdc;
    PAINTSTRUCT ps;
    int iCount = 0 , iXPos , iYPos;
    const int WIDTH_BYTE = 
        4 * ((bmpCoreHeader.bcWidth * bmpCoreHeader.bcBitCount + 31)/ 32);

    switch (msg) {
    case WM_DESTROY:
        free(chPixelBit);
        PostQuitMessage(0);
        return 0;
    case WM_PAINT:
        hdc = BeginPaint(hWnd , &ps);
        for (iYPos = 0 ; iYPos < bmpCoreHeader.bcHeight ; iYPos++) {
            for (iXPos = 0 ; ; iXPos++) {
                if (iXPos > (bmpCoreHeader.bcWidth - 1)) {
                    iCount = (iYPos + 1) * WIDTH_BYTE;
                    break;
                }
                SetPixel(hdc , iXPos , iYPos , RGB(
                    chPixelBit[iCount + 2] ,
                    chPixelBit[iCount + 1] ,
                    chPixelBit[iCount]
                ));
                iCount += 3;
            }
        }
        EndPaint(hWnd , &ps);
        return 0;
    }
    return DefWindowProc(hWnd , msg , wp , lp);
}

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
            PSTR lpCmdLine , int nCmdShow) {
    HWND hWnd;
    MSG msg;
    WNDCLASS winc;
    HANDLE hFile;
    DWORD dwBytes;
    int iColorTableLength;


    hFile = CreateFile(lpCmdLine , GENERIC_READ , 0 , NULL ,
        OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL);
    if (hFile == INVALID_HANDLE_VALUE) return 1;

    ReadFile(hFile , &bmpFileHeader , sizeof(BITMAPFILEHEADER) , &dwBytes , NULL);
    if (bmpFileHeader.bfType != 0x4D42) {
        MessageBox(NULL , TEXT("This is not a bitmap file") , NULL , MB_OK);
        return 1;
    }

    ReadFile(hFile , &bmpCoreHeader , sizeofBITMAPCOREHEADER) , &dwBytes , NULL);

    chPixelBit = (char *) malloc (bmpFileHeader.bfSize -bmpFileHeader.bfOffBits);
    ReadFile(hFile , chPixelBit ,
        bmpFileHeader.bfSize - bmpFileHeader.bfOffBits , &dwBytes , NULL);
    CloseHandle(hFile);

    winc.style   = CS_HREDRAW | CS_VREDRAW;
    winc.lpfnWndProc        = WndProc;
    winc.cbClsExtra  = winc.cbWndExtra    = 0;
    winc.hInstance    = hInstance;
    winc.hIcon    = LoadIcon(NULL , IDI_APPLICATION);
    winc.hCursor        = LoadCursor(NULL , IDC_ARROW);
    winc.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);
    winc.lpszMenuName   = NULL;
    winc.lpszClassName  = TEXT("KITTY");

    if (!RegisterClass(&winc)) return 1;

    hWnd = CreateWindow(
            TEXT("KITTY") , lpCmdLine ,
            WS_OVERLAPPEDWINDOW ^ WS_THICKFRAME  | WS_VISIBLE  ,
            CW_USEDEFAULT , CW_USEDEFAULT ,
            bmpCoreHeader.bcWidth ,
            bmpCoreHeader.bcHeight + GetSystemMetrics(SM_CYCAPTION) ,
            NULL , NULL , hInstance , NULL
    );

    if (hWnd == NULL) return 1;

    while (GetMessage(&msg , NULL , 0 , 0 )) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:windowsプログラム 7300 επιστημη 2007/04/04 10:46:21


No.7300

Re:windowsプログラム
投稿者---επιστημη(2007/04/04 10:46:21)
http://blogs.wankuma.com/episteme/


>WIDTH_BYTE =
>4 * ((bmpCoreHeader.bcWidth * mpCoreHeader.bcBitCount + 31)/ 32);
>
>なぜ4を掛け 31を足し、32で割るのか教えてください

WIDTH_BYTEは4の倍数でなくてはならんからで、
1pixel : 4byte
2pixel : 4byte
...
32pixel : 4byte
33pixel : 8byte
...
という系列を生成するために 4*((pixel+31)/32) なんでしょね。


>setPixelの部分で、iCountに1や2をなぜ足すのか教えてください。

1byteずつ、順にR,G,B値がはいってるんでしょううね。

>iCount+=3の意味も教えてください

3byteで1pixelを表現してんじゃないかしら




この投稿にコメントする

削除パスワード

No.7316

Re:windowsプログラム
投稿者---ko(2007/04/08 16:42:22)


回答どうもありがとうございます。

DIBがさっぱり解らず、回答も良く理解できませんでした。
いろいろ調べてるうち、回答の意味がつかめました。
すごく解りやすい回答です。
どうもありがとうございます!

もう1つ疑問なんですが、
iCount = (iYPos + 1) * WIDTH_BYTE;

でなぜiYPosに1をたしてるんでしょうか?







この投稿にコメントする

削除パスワード

No.7317

Re:windowsプログラム
投稿者---επιστημη(2007/04/09 00:20:38)
http://blogs.wankuma.com/episteme/


>iCount = (iYPos + 1) * WIDTH_BYTE;
>でなぜiYPosに1をたしてるんでしょうか?

当然じゃないですか?
x方向を読みつくしたのなら、yは次のラインに進めないと。


この投稿にコメントする

削除パスワード

No.7319

Re:windowsプログラム
投稿者---ko(2007/04/09 21:59:08)


回答どうもありがとうございます!
いろいろ考えてるうち解りにくくなっていたもので。
なるほどそうですね。
たびたび教えて頂き
ありがとうございます。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ