PocketPCでスライドを見る事があるかどうかは???だけど面白いと思う
わざわざ時間をかけて動画ファイルへのレンダリングをしないで、画像ファイルから直接動きのあるスライドショーできるようなアプリがあったら良いかな?と思って作ってみることにした
やってみると色々問題があってうまくいかない
jpgファイルを読み込んで表示するまではよいのだけど、フェードインフェードアウト等の効果をつけるのに画像データを直接いじくる必要があって、この処理をすると遅くて使い物にならなくなってしまった
CreateDIBSectionでDIBイメージを作って画像データをいじくろうと思ったのだけど、CreateDIBSectionで作った画像を画面にBltするだけでエラク遅くなってしまう
DIBからDDBの変換に時間がかかってしまうみたい
DDBのまま画像をデータを処理できれば良いのだけど...
jpgファイルはこんな感じで読み込む
m_hBmp = SHLoadImageFile(fname);
BITMAP bmp;
GetObject(m_hBmp,sizeof(bmp),&bmp);
m_Width = bmp.bmWidth;
m_Height = bmp.bmHeight;
m_WidthByte = bmp.bmWidthBytes;
m_buf = (LPBYTE)(bmp.bmBits);
読み込まれたビットマップはDDBで、Zero3ではRGB565となると思う
RGB888でアクセスしたいのでDIB形式のbitmapを作ってbltした
BITMAPINFO BmpInfo;
BmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
BmpInfo.bmiHeader.biWidth=m_Width;
BmpInfo.bmiHeader.biHeight=m_Height;
BmpInfo.bmiHeader.biPlanes=1;
BmpInfo.bmiHeader.biBitCount=32;
BmpInfo.bmiHeader.biCompression=BI_RGB;
RGBQUAD *DIBBuf;
HBITMAP hDIBBmp = CreateDIBSection(NULL,&BmpInfo,DIB_RGB_COLORS,(void**)&DIBBuf,NULL,0);
HDC hDDBDC = CreateCompatibleDC(0);
SelectObject(hDDBDC, m_hBmp);
HDC hDIBDC = CreateCompatibleDC(0);
SelectObject(hDIBDC, hDIBBmp);
src_buf =(RGBQUAD*)HeapAlloc(GetProcessHeap(), 0,m_Width*m_Height*4);
BitBlt(hDIBDC ,0,0,m_Width,m_Height, hDDBDC,0,0,SRCCOPY);
memcpy(src_buf,DIBBuf,m_Width*m_Height*4);
DeleteObject(hDDBDC);
DeleteObject(hDIBBmp);
DeleteObject(hDIBDC);
なんか回りくどい事をしているような気がする
src_buf にRGBQUADの画像データが入ってるので
m_buf に加工したデータをコピーして画面上にBitBltかStretchBltする
StretchBltすると拡大とか縮小して表示できる
0 件のコメント:
コメントを投稿