2007年4月12日木曜日

スライドショーをPocketPCで...

Microsoft Windows フォトストーリーのビデオファイルの出力先としてPocketPCが選べる
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 件のコメント: