YouTubeが、あまりにくだらない。
「鬼滅の刃」人気に乗じて、下品な動画ばかり。著作権侵害や名誉毀損になるだろう。
YouTuberが、いかにバカでくだらないじんしゅか、よくわかる。本当に下品すぎる。
子どもがYouTubeの馬鹿みたいな動画ばかり見ているものだから、禁止にした。
「鬼滅の刃」は第1話しか見たことがないが、内容は良さそうだと思ったのだが・・・こんな下品な動画ばかり横行しているのを観ると、本当は、鬼滅の刃も、その程度なのだろうか。
バカにしている人が実は多いのかもしれない。
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/
子供のゲーム中に休憩時間をお知らせ
*************************************************************