- ベストアンサー
SetDIBitsToDeviceで88x31のpngを表示できない問題の解決方法
- SetDIBitsToDevice関数を使用して88x31のpngファイルを表示しようとしていますが、絵が表示されません。
- 問題の原因は、BITMAPINFO構造体の設定にあります。正しい設定を行うことで解決できます。
- 具体的には、BITMAPINFO構造体のbiBitCountの値を正しく設定する必要があります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
JPEGのサンプルです。 おそらくpngも同じでしょう。 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_7378.asp あと、エラーになったときは、APIの戻り値、GetLastError()の値を書いてくださいね。 ぱっと見では、bmpInfo.bmiHeader.biSizeがおかしい気がしますが。
その他の回答 (4)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
後のほうの参考urlの内容、よく読むとulはunsigned long というかDWORDですね。 なんで、サンプルはキャストが抜けてますね(^^;;;
- taka_tetsu
- ベストアンサー率65% (1020/1553)
ExtEscape() http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpgdi/html/_win32_extescape.asp >ulの型はどのようにすればいいのでしょうか? >int,unsigned,LPSTRではエラーになります。 ヘルプを見ると、LPSTRとかいてあります。 で、サンプルのパラメータを見ると&がついてます。 ということで、charでしょうね。 >2番目のExtEscapeは引数の順は大丈夫なのでしょうか? >(・・・,pvJpgImage,nJpgImageSize,・・・) (?_?)・・・ 逆みたいですね(^^;;; あと、こんなページもありました。 新たなキーワードがあったら再度検索してみるのもどうでしょう? http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/prntspol_5juc.asp
- taka_tetsu
- ベストアンサー率65% (1020/1553)
一応参考までに・・・ >GetLastError()は87 winerror.hでは、 87 == ERROR_INVALID_PARAMETER The parameter is incorrect. FormatMessage()で日本語を取得すると、 「パラメータが間違っています。」 でした。
補足
98seでサポートされているのかが疑わしくなってきました。 例の前段が気になります。 ul=CHECKJPEGFORMAT; if ( (ExtEscape(hD,QUERYESCSUPPORT,sizeof(ul),&ul,0,0)>0) && (ExtEscape(hD,CHECKJPEGFORMAT,pvJpgImage,nJpgImageSize,sizeof(ul),&ul)>0) && (ul == 1) ) において ulの型はどのようにすればいいのでしょうか? int,unsigned,LPSTRではエラーになります。 2番目のExtEscapeは引数の順は大丈夫なのでしょうか?(・・・,pvJpgImage,nJpgImageSize,・・・) よろしくお願いします。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>ぱっと見では、bmpInfo.bmiHeader.biSizeがおかしい気がしますが。 ここあってますね。失礼しました。 自分の中でWORDを4バイトで数えてました。
お礼
SetDIBitsToDeviceの関数値が0になっていたのでエラーしている事が分かりました。 GetLastError()は87でした。
補足
大変参考になる例のリンクありがとうございました。 例によると bmpInfo.bmiHeader.biSize=40; bmpInfo.bmiHeader.biWidth=88; bmpInfo.bmiHeader.biHeight=-31;//修正点 bmpInfo.bmiHeader.biPlanes=1; bmpInfo.bmiHeader.biBitCount=0; bmpInfo.bmiHeader.biCompression=BI_PNG; bmpInfo.bmiHeader.biSizeImage=絵bufferのsize; bmpInfo.bmiHeader.biXPelsPerMeter=0; bmpInfo.bmiHeader.biYPelsPerMeter=0; bmpInfo.bmiHeader.biClrUsed=0; bmpInfo.bmiHeader.biClrImportant=0; として int SetDIBitsToDevice( HDC hdc, int XDest,←0 int YDest,←0 DWORD dwWidth,←88 DWORD dwHeight,←31 int XSrc,←0 int YSrc,←0//決定点 UINT uStartScan,←0 UINT cScanLines,←31 CONST VOID *lpvBits,←絵bufferのpointer CONST BITMAPINFO *lpbmi,←&bmpInfo UINT fuColorUse←DIB_RGB_COLORS ); 一番気になるのは絵bufferにpngファイルから読みとったすべてのデータを入れたのですがそれでいいのかという点です。 チャンクを分析して一部だけをバッファに入れないといけないので有れば関数の価値は無くなりますからね。 絵データのみ入れるとパレット情報が抜けてしまうし・・・
お礼
何度も調べてもらってありがとうございます。 マイクロソフトはもうけているのだからいい加減な例を出さないでほしいものですね。 そのままコンパイルすれば動く例を出さないのが不思議ですね。