YouTubeが、あまりにくだらない。

 

「鬼滅の刃」人気に乗じて、下品な動画ばかり。著作権侵害や名誉毀損になるだろう。

 

YouTuberが、いかにバカでくだらないじんしゅか、よくわかる。本当に下品すぎる。

 

 

子どもがYouTubeの馬鹿みたいな動画ばかり見ているものだから、禁止にした。

 

「鬼滅の刃」は第1話しか見たことがないが、内容は良さそうだと思ったのだが・・・こんな下品な動画ばかり横行しているのを観ると、本当は、鬼滅の刃も、その程度なのだろうか。

バカにしている人が実は多いのかもしれない。

 

 DIBを中心としてデータ管理を行うつもりなので、不透明度は BYTE 配列に保持しておく。

 それを前提に読み取ってみる。

 

void ReadPNG(Gdiplus::Bitmap* pImage , CSize sizeBitmap)

{

    Gdiplus::BitmapData bmpData ;
    BYTE btAlphaSrc ;
    /*******************************************************
    // alpha =   0 : 透過 //
    // alpha = 255 : 完全塗り潰し
   ********************************************************/

    // 1. 初期設定 //
    // (1). 32ビットでない場合 //
    if (pImage->GetPixelFormat() != PixelFormat32bppARGB) return ;

    // (2). 四角形サイズ //
    Gdiplus::Rect rc(0 , 0 , sizeBitmap.cx , sizeBitmap.cy) ;

    // (3). ロック //
    pImage->LockBits(

                    &rc,

                    ImageLockModeRead | ImageLockModeWrite ,

                    PixelFormat32bppARGB ,

                    &bmpData

                ) ;

    // (4). ピクセル当たりのバイト数 //
    UINT BytesPerPixel = 4 ;

    // 2. ピクセルデータへのアドレス //

    // 残念ながら、このあたりは、他の方のコピー //

    BYTE* pixels = NULL ;

    if(bmpData.Stride > 0)
    {
        pixels = (BYTE*)bmpData.Scan0;
    }
    else
    {
        pixels = (BYTE*)bmpData.Scan0 + bmpData.Stride * (sizeBitmap.cy - 1) ;
    }
    // これが、よくわからない //
    UINT stride = abs(bmpData.Stride);

    // 3. 透過部分を列挙 //
    for(int y = 0 ; y < sizeBitmap.cy ; y++)
    {
        for(int x = 0 ; x < sizeBitmap.cx ; x++)
        {
            // (1). ピクセル (x , y) のアドレス //
            BYTE* pCol = pixels + y * stride + BytesPerPixel * x ;


            // (2). b = p[0] , g = p[1] , r = p[2] , a = p[3] //
            btAlphaSrc = (BYTE)pCol[3] ;

            // (3). 不透明度を配列に保存 //

            // 各自記述 //
        } // Next x //
    } // Next y //

    // 5. 解除 //
    pImage->UnlockBits(&bmpData) ;
}


こんな感じでしょう。

GetPixel()、SetPixel()が遅いということで、ピクセルのアドレスを取得して、その値だけを取り出してます。

 

 ファイルを読み取る時だけだから、多少時間がかかっても、そこはいいでしょう。

 

 PNG形式ファイルを解析すると、こんな感じで成功します。

 

 

 

 読み取るだけであれば、GDI+ の力を借りれば良い。

 

 しかし、PNG形式ファイルを読み取り、その後どう取り扱っていくか?

 

 ゲーム用のDXライブラリであれば、LoadGraph()関数でいいのだが、普通にC++で扱っていこうと思うとビットマップ HBITMAP になるのだろうか。

 

 DIB形式の独自クラスを作り、GetDIBitmap()関数と連動させていくなら、24ビットのデータ配列になる。

 そうなったら、不透明度 alpha (0~255)をどう保持して管理するか。

 

 DIBクラスを独自に作成し、そこから派生したクラス CDibArgb クラスを作る。

 縦X横のサイズだけ BYTE 配列を用意し、そこに不透明度を入れておく。

 

 単純な考えだ。

 

HBITMAP LoadPNG(LPCTSTR lpszPathFilename)

{

    // (1). 画像読み込み //
    Gdiplus::Bitmap* pImage = new Gdiplus::Bitmap(lpszPathFilename) ;

    // (2). 画像の縦幅と横幅を取得 //
    CSize sizeBitmap( (int)pImage->GetWidth() , (int)pImage->GetHeight() ) ;

    // 画像 GDI+ (Image) から HBITMAP に変換 //

    // (プログラマー自身でメモリ解放する必要がある) //
    HBITMAP hBitmap = ※ファイルからHBITMAP作成する関数


    // メモリ破棄 //
    delete pImage ;

    return hBitmap ;
}


流れはこんな感じなのだが、さて、ファイルからHBITMAPを作成する関数と、不透明度を保持するのと、そこを設計していく必要がある。

たいしたことはないけれど。

 

 

C++で制作したフリーソフトの制作日記と、子どもの様子を、綴っていきます。
*************************************************************
Windows用フリーソフト(無料)総合サイト
http://yoyontek-develop.minim.ne.jp/
-------------------------------------------------------------
(1) 【 背景透過&境界線お掃除 】
http://yoyontek-develop.minim.ne.jp/clean-pic-fringe/
画像ファイルの背景を透過させ、境界線の汚れを除去(PNG対応)
-------------------------------------------------------------
(2) 【 休憩タイムアラート for KIDS 】
http://yoyontek-develop.minim.ne.jp/alert-kids/
子供のゲーム中に休憩時間をお知らせ
*************************************************************