• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SetDIBitsToDeviceで88x31のpngを)

SetDIBitsToDeviceで88x31のpngを表示できない問題の解決方法

このQ&Aのポイント
  • SetDIBitsToDevice関数を使用して88x31のpngファイルを表示しようとしていますが、絵が表示されません。
  • 問題の原因は、BITMAPINFO構造体の設定にあります。正しい設定を行うことで解決できます。
  • 具体的には、BITMAPINFO構造体のbiBitCountの値を正しく設定する必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

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)
回答No.5

後のほうの参考urlの内容、よく読むとulはunsigned long というかDWORDですね。 なんで、サンプルはキャストが抜けてますね(^^;;;

keyguy
質問者

お礼

何度も調べてもらってありがとうございます。 マイクロソフトはもうけているのだからいい加減な例を出さないでほしいものですね。 そのままコンパイルすれば動く例を出さないのが不思議ですね。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

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

参考URL:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/prntspol_5juc.asp
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

一応参考までに・・・ >GetLastError()は87 winerror.hでは、 87 == ERROR_INVALID_PARAMETER The parameter is incorrect. FormatMessage()で日本語を取得すると、 「パラメータが間違っています。」 でした。

keyguy
質問者

補足

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)
回答No.2

>ぱっと見では、bmpInfo.bmiHeader.biSizeがおかしい気がしますが。 ここあってますね。失礼しました。 自分の中でWORDを4バイトで数えてました。

keyguy
質問者

お礼

SetDIBitsToDeviceの関数値が0になっていたのでエラーしている事が分かりました。 GetLastError()は87でした。

keyguy
質問者

補足

大変参考になる例のリンクありがとうございました。 例によると 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ファイルから読みとったすべてのデータを入れたのですがそれでいいのかという点です。 チャンクを分析して一部だけをバッファに入れないといけないので有れば関数の価値は無くなりますからね。 絵データのみ入れるとパレット情報が抜けてしまうし・・・

関連するQ&A