掲示板利用宣言

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

 私は

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

掲示板1

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

No.7695

画像処理
投稿者---ww(2007/07/20 11:43:06)


96x4の水色レーザーのつもりでしたが
32x4のレーザーになってしまいました。
メモリ領域を確保し, for文で水色を代入したはずなんですが。
何処を改善すればいいか教えてください。



LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { BITMAPINFO          biSCInfo;


    HDC                  hdc,  hdcSC;
    PAINTSTRUCT          ps;

    static    HBITMAP    hOld;
    HBITMAP              hSCBMP;
    LPDWORD	         lpPixelBuf,;lpSCPixel
    LPDWORD 	         alpChrPixel, lpBGPixel, ooo;
    int                  i, j, r, g, b;


    switch (iMsg) {

    case WM_CREATE:

        /* バッファ確保 */
        lpPixelBuf = (LPDWORD)HeapAlloc(GetProcessHeap(),
                HEAP_ZERO_MEMORY, (32 * 32 + 32 * 96 + 480 * 480) * 4);

        /* ピクセル列の先頭アドレス設定 */
        
        alpChrPixel = lpPixelBuf ;

        ooo =  lpPixelBuf + 1024;
    
        /* 背景ピクセル列アドレス設定 */
        lpBGPixel = lpPixelBuf + (1024 + 32 * 96);


        for (i = 0;i < 32;i++) {
            for (j = 16;j < 32;j++) {

                r = 96 - i;
                g = 128 + i * 2;
                b = 64;

                *(alpChrPixel + (i + j * 32)) = (r << 16) + (g << 8) + b;

            }
        }

  
        for (i = 0;i < 96;i++) {
            for (j = 14;j < 18;j++) {
                *( ooo + (j +  i * 96)) = 0x004080ff;
            }
        }

        srand((unsigned)time(NULL));

        /* 背景画像初期化 */
        for (i = 0;i < 480 * 480;i++) {

            r = rand() % 64 + 32;
            g = rand() % 32;
            b = rand() % 64 + 64;

            lpBGPixel[i] = (r << 16) + (g << 8) + b;

        }

        /* DIBSection用BITMAPINFOをゼロクリア */
        ZeroMemory(&biSCInfo, sizeof(BITMAPINFO));

        /* DIBSection用BITMAPINFO設定 */
        biSCInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
        biSCInfo.bmiHeader.biWidth = 480;
        biSCInfo.bmiHeader.biHeight = -480;
        biSCInfo.bmiHeader.biPlanes = 1;
        biSCInfo.bmiHeader.biBitCount = 32;
        biSCInfo.bmiHeader.biCompression = BI_RGB;

        /* ウインドウのデバイスコンテキスト取得 */
        hdc = GetDC(hwnd);

        /* biSCinfoからバックバッファ用DIBSectionを作成 */
        hSCBMP = CreateDIBSection(hdc, &biSCInfo, DIB_RGB_COLORS, 
               (LPVOID)(&lpSCPixel), NULL, 0);

        /* DIBSection用のメモリDCを作成 */
        hdcSC = CreateCompatibleDC(hdc);

        /* メモリDCにDIBSectionを選択 */
        hOld = SelectObject(hdcSC, hSCBMP);

        /* 不要になったウインドウのDCを解放 */
        ReleaseDC(hwnd, hdc);

        CopyMemory(lpSCPixel, lpBGPixel, 480 * 480 * 4);


    for (i = 0;i < 32;i++) {
        for (j = 0;j < 32;j++) {
            if (*(alpChrPixel + (j + i * 32)) != 0) {
                lpSCPixel[240 + j + (i + 440) * 480] =
                        *(alpChrPixel + (j + i * 32));
            }
        }
    }

        for (i = 0;i < 96;i++) {
            for (j = 0;j < 32;j++) {
                if (*(ooo + (j + i * 96)) != 0) {
                    lpSCPixel[240 + j + (i + 200) * 480] =
                            *(ooo + (j + i * 96));
                }
            }
        }
        return 0;

    case WM_PAINT:

        hdc = BeginPaint(hwnd, &ps);

        /* バックバッファを表示 */
        BitBlt(hdc, 0, 0, 480, 480, hdcSC, 0, 0, SRCCOPY);

        EndPaint(hwnd, &ps);

        return 0;

        }

    return DefWindowProc(hwnd, iMsg, wParam, lParam);

}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:画像処理 7698 ぽへぇ 2007/07/21 21:24:46


No.7698

Re:画像処理
投稿者---ぽへぇ(2007/07/21 21:24:46)


>何処を改善すればいいか教えてください。
マジックナンバーが多すぎて、何がなんだかわかりません。

・???ピクセル x ???ピクセルのビットマップを作ろうとしている
・そのうち上から ? ピクセルは 〜 のつもり
・そこから ? ピクセルは 〜 のつもり
といった感じで意図するを書いてください。



この投稿にコメントする

削除パスワード

No.7699

Re:画像処理
投稿者---ww(2007/07/21 22:40:34)



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

実際コンパイルしていただければ解るとおもいますが
(変数の宣言のところstaticが足りなかったのでそこだけ書き加えました)

480x480の背景に,32x16の長方形 4x96の長方形をかいてます。
しかし,4x96が4x32の長方形に表示されます



プログラムの簡単説明。

1 最初2個のfor文で, 32x16の長方形の, 色をアドレスに代入

2 次の2個のfor文で, 4x96の長方形の, 色をアドレスに代入 
  狙いとしては4x96の長方形を表示したい。
  しかし実際4x32の長方形が表示されます。

ちゃんとfor文で96回色を代入してると思うんですが
 なぜ4x32の長方形が表示されるんでしょうか?

よろしければアドバイスをお願いします。





#include<windows.h>

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { BITMAPINFO          biSCInfo;


    static HDC           hdc,  hdcSC;
    PAINTSTRUCT          ps;

    static    HBITMAP    hOld;
    static    HBITMAP    hSCBMP;
    LPDWORD              lpPixelBuf,lpSCPixel;
    LPDWORD              alpChrPixel, lpBGPixel, ooo;
    int                  i, j, r, g, b;


    switch (iMsg) {

    case WM_CREATE:

        /* バッファ確保 */
        lpPixelBuf = (LPDWORD)HeapAlloc(GetProcessHeap(),
                HEAP_ZERO_MEMORY, (32 * 32 + 32 * 96 + 480 * 480) * 4);

        /* ピクセル列の先頭アドレス設定 */
        
        alpChrPixel = lpPixelBuf ;

        ooo =  lpPixelBuf + 1024;
    
        /* 背景ピクセル列アドレス設定 */
        lpBGPixel = lpPixelBuf + (1024 + 32 * 96);


        for (i = 0;i < 32;i++) {
            for (j = 16;j < 32;j++) {

                r = 96 - i;
                g = 128 + i * 2;
                b = 64;

                *(alpChrPixel + (i + j * 32)) = (r << 16) + (g << 8) + b;

            }
        }

  
        for (i = 0;i < 96;i++) {
            for (j = 14;j < 18;j++) {
                *( ooo + (j +  i * 96)) = 0x004080ff;
            }
        }

        srand((unsigned)time(NULL));

        /* 背景画像初期化 */
        for (i = 0;i < 480 * 480;i++) {

            r = rand() % 64 + 32;
            g = rand() % 32;
            b = rand() % 64 + 64;

            lpBGPixel[i] = (r << 16) + (g << 8) + b;

        }

        /* DIBSection用BITMAPINFOをゼロクリア */
        ZeroMemory(&biSCInfo, sizeof(BITMAPINFO));

        /* DIBSection用BITMAPINFO設定 */
        biSCInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
        biSCInfo.bmiHeader.biWidth = 480;
        biSCInfo.bmiHeader.biHeight = -480;
        biSCInfo.bmiHeader.biPlanes = 1;
        biSCInfo.bmiHeader.biBitCount = 32;
        biSCInfo.bmiHeader.biCompression = BI_RGB;

        /* ウインドウのデバイスコンテキスト取得 */
        hdc = GetDC(hwnd);

        /* biSCinfoからバックバッファ用DIBSectionを作成 */
        hSCBMP = CreateDIBSection(hdc, &biSCInfo, DIB_RGB_COLORS, 
               (LPVOID)(&lpSCPixel), NULL, 0);

        /* DIBSection用のメモリDCを作成 */
        hdcSC = CreateCompatibleDC(hdc);

        /* メモリDCにDIBSectionを選択 */
        hOld = SelectObject(hdcSC, hSCBMP);

        /* 不要になったウインドウのDCを解放 */
        ReleaseDC(hwnd, hdc);

        CopyMemory(lpSCPixel, lpBGPixel, 480 * 480 * 4);


    for (i = 0;i < 32;i++) {
        for (j = 0;j < 32;j++) {
            if (*(alpChrPixel + (j + i * 32)) != 0) {
                lpSCPixel[240 + j + (i + 440) * 480] =
                        *(alpChrPixel + (j + i * 32));
            }
        }
    }

        for (i = 0;i < 96;i++) {
            for (j = 0;j < 32;j++) {
                if (*(ooo + (j + i * 96)) != 0) {
                    lpSCPixel[240 + j + (i + 200) * 480] =
                            *(ooo + (j + i * 96));
                }
            }
        }
        return 0;

    case WM_PAINT:

        hdc = BeginPaint(hwnd, &ps);

        /* バックバッファを表示 */
        BitBlt(hdc, 0, 0, 480, 480, hdcSC, 0, 0, SRCCOPY);

        EndPaint(hwnd, &ps);

        return 0;

        }

    return DefWindowProc(hwnd, iMsg, wParam, lParam);

}



この投稿にコメントする

削除パスワード

No.7700

Re:画像処理
投稿者---ぽへぇ(2007/07/22 00:08:34)


縦軸と横軸の関係がごっちゃになっています。

>*( ooo + (j + i * 96)) = 0x004080ff
これでは 96*96の計算の仕方です。
同様の間違いがいくつかありますね。

好みの問題かもしれませんが、私なら変数名をi, j ではなく、
x, y にするかなぁ。



この投稿にコメントする

削除パスワード

No.7701

Re:画像処理
投稿者---ww(2007/07/22 11:54:56)


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

>*( ooo + (j + i * 96)) = 0x004080ff
これでは 96*96の計算の仕方です。
同様の間違いがいくつかありますね。

なるほど, これは思い込みなのか見つけることができませんでした。
WM_DESTRY削除してあるので,実行するとハンドルがメモリに残るのか
削除できませんね。再起動すれば削除できるみたいです。

本当に助かりました。
どうもありがとうございます。m(_ _)m



この投稿にコメントする

削除パスワード

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





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