とりあえず、1ピクセル32ビットのアルファチャンネルを出力できるC++のコードを作成できました。コンパイルして実行すればAVIファイルができるので、それを動画編集ソフトに取り込めば背景が透過します。
バグなどの問題もあるので、手持ちの数値データを動画にしたいなどの個人的なツールとして利用するための参考にしてみてください。
- #include <windows.h>
- #include <vfw.h>
- #pragma comment (lib, "vfw32.lib")
- //実行すると100までカウントアップするアルファチャンネル付きAVI動画を作成します。。
- //g++ .\outCntAviA.cpp -mwindows -lvfw32
- void paintAlpha(LPDWORD lpPixel,const unsigned int alpha,const RECT *fill,const RECT *canbas){
-
- unsigned char *pTest;
-
- for(int y=fill->top;y<fill->bottom;y++){
- for(int x=fill->left;x<fill->right;x++){
-
- int memadr = x+(canbas->bottom - y)*canbas->right;
-
-
-
- pTest=(unsigned char *)&lpPixel[memadr];
- pTest++; //B
- pTest++; //G
- pTest++; //R
- *pTest = alpha; //A
-
- }
- }
-
-
- }
- int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
- {
- PAVIFILE pfile;
- PAVISTREAM pavi;
- AVISTREAMINFO si;
- LPAVISTREAMINFO lpsi = &si;
- HDC hdcMem;
- HBITMAP hbmpMem, hbmpMemPrev;
- DWORD i;
- TCHAR szBuf[32];
- LPVOID lpBits;
- BITMAPV5HEADER bmiHeader;
-
- AVIFileInit();
- if (AVIFileOpen(&pfile, TEXT("video.avi"), OF_CREATE | OF_WRITE, NULL) != 0) {
- MessageBox(NULL, TEXT("Fail file open."), TEXT("OK"), MB_OK);
- AVIFileExit();
- return 0;
- }
- ZeroMemory(&si, sizeof(AVISTREAMINFO));
- si.fccType = streamtypeVIDEO;
- si.fccHandler = comptypeDIB;
- si.dwScale = 1;
- si.dwRate = 2;
- si.dwLength = 0;
- si.dwQuality = (DWORD)-1;
- SetRect(&si.rcFrame, 0, 0, 300,200);
- if (AVIFileCreateStream(pfile, &pavi, &si) != 0) {
- MessageBox(NULL, TEXT("Fail open stream."), TEXT("OK"), MB_OK);
- AVIFileRelease(pfile);
- AVIFileExit();
- return 0;
- }
- ZeroMemory(&bmiHeader, sizeof(BITMAPINFOHEADER));
- bmiHeader.bV5Size = sizeof(BITMAPINFOHEADER);
- bmiHeader.bV5Width = lpsi->rcFrame.right;
- bmiHeader.bV5Height = lpsi->rcFrame.bottom;
- bmiHeader.bV5Planes = 1;
- bmiHeader.bV5BitCount = 32;
- bmiHeader.bV5Compression = BI_RGB;
- bmiHeader.bV5SizeImage = bmiHeader.bV5Height * bmiHeader.bV5Width * 4;
- if (AVIStreamSetFormat(pavi, 0, &bmiHeader, sizeof(BITMAPINFOHEADER)) != 0){
- MessageBox(NULL, TEXT("Fail Init BMI Header."), TEXT("OK"), MB_OK);
- }
- hdcMem = CreateCompatibleDC(NULL);
- hbmpMem = CreateDIBSection(NULL, (LPBITMAPINFO)&bmiHeader, DIB_RGB_COLORS, &lpBits, NULL, 0);
- hbmpMemPrev = (HBITMAP)SelectObject(hdcMem, hbmpMem);
- SetBkMode(hdcMem, TRANSPARENT);
- SetTextColor(hdcMem, RGB(255, 255, 255));
- HGDIOBJ hFont = CreateFontW(100, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS,
- CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"UI Gothic");
- HGDIOBJ hFontOld = SelectObject(hdcMem, hFont);
-
- HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 0));
- for (int fCnt = 0; fCnt < 1000; fCnt++) {
- wsprintf(szBuf, TEXT("%d"), fCnt);
- FillRect(hdcMem, &lpsi->rcFrame, hBrush);
- //アルファチャンネル塗りつぶし
- paintAlpha((LPDWORD)lpBits,0x90,&si.rcFrame,&si.rcFrame);
-
- DrawText(hdcMem, szBuf, -1, &lpsi->rcFrame, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
- AVIStreamWrite(pavi, fCnt, 1, lpBits, bmiHeader.bV5SizeImage, AVIIF_KEYFRAME, NULL, NULL);
- }
-
- SelectObject(hdcMem, hFontOld);
- DeleteObject(hFont);
-
- DeleteObject(hBrush);
-
- SelectObject(hdcMem, hbmpMemPrev);
- DeleteObject(hbmpMem);
- DeleteDC(hdcMem);
-
- MessageBox(NULL, TEXT("Done."), TEXT("OK"), MB_OK);
- AVIStreamRelease(pavi);
- AVIFileRelease(pfile);
- AVIFileExit();
- return 0;
- }