一般的な画像フォーマットの縦横サイズの取得方法は?
Posted: 2006年2月26日(日) 15:15
いつもお世話になっております。
一般的な画像フォーマットの縦横サイズを取得するにはどうしたらよいのでしょうか?
DLLを用いて取得してみようとしましたが、
原因不明のエラーが出てしまい困っています。
≪やりたいこと≫
・BMPのみならず、jpeg、Gif、png画像の縦横サイズを得たい。
(BMPはLoadImageで読み込める故)
≪アプローチ方法≫
LoadImageのような使い方でBMP、jpeg、Gif、pngを読み込んで
そのビットマップハンドルを返す[loadimgp.dll]というDLLを使い、
その後にGetObject( hBmp, Len(lpBITMAP), lpBITMAP )を用いて、
画像の縦横サイズを得ようとした。
※loadimgp.dllの場所
http://www.vector.co.jp/soft/win95/prog/se375198.html
≪発生した問題≫
DLLの呼び出し自体は成功するが、それを行った関数を抜けようとすると
アクセス違反と言われる。
グローバルから数えて、2階層以上の関数でエラーが起こる。
(グローバル、1階層めの関数ではエラーしない・・・と言って伝わるでしょうか?^^;)
Ver4.10.02で試したところ、アクセス違反は起きなくなりましたが、
コードの動作がおかしくなりました。
(関数の途中で勝手に抜けたり、値が代入されなかったり。)
そちらの方は、どういうエラーが起きているのか理解できていません。
≪聞きたいこと≫
上記の方法でなくても、Gif、Jpeg、pngの縦横サイズが
読み取れるのであれば構いません。
直にフォーマットのヘッダ?を読み取ることも考えて
Googleで調べたのですが、仕様は見つけられませんでした・・・。
宜しくご教授お願い致します。
一般的な画像フォーマットの縦横サイズを取得するにはどうしたらよいのでしょうか?
DLLを用いて取得してみようとしましたが、
原因不明のエラーが出てしまい困っています。
≪やりたいこと≫
・BMPのみならず、jpeg、Gif、png画像の縦横サイズを得たい。
(BMPはLoadImageで読み込める故)
≪アプローチ方法≫
LoadImageのような使い方でBMP、jpeg、Gif、pngを読み込んで
そのビットマップハンドルを返す[loadimgp.dll]というDLLを使い、
その後にGetObject( hBmp, Len(lpBITMAP), lpBITMAP )を用いて、
画像の縦横サイズを得ようとした。
※loadimgp.dllの場所
http://www.vector.co.jp/soft/win95/prog/se375198.html
≪発生した問題≫
DLLの呼び出し自体は成功するが、それを行った関数を抜けようとすると
アクセス違反と言われる。
グローバルから数えて、2階層以上の関数でエラーが起こる。
(グローバル、1階層めの関数ではエラーしない・・・と言って伝わるでしょうか?^^;)
ソースはこちら [ここをクリックすると内容が表示されます]
開発環境はWin2000 + AB-Ver.3.13です。コード: 全て選択
#N88BASIC
Declare Function LoadImagePlus Lib "loadimgp.dll" Alias "LoadImagePlus" ( pImgFilePath As BytePtr ) As DWord
Dim r As DWord
r = Main()
End
Function Main() As Long
Dim s As String
Dim hBmp As DWord
Dim r As DWord
s = "picture.jpg"
hBmp = LoadImagePlus( StrPtr(s) )
'↑関数化せずに直に書くとエラーはしない。
'↓しかし、関数にするとエラーする。
r = GetImgSquareSize( StrPtr(s) )
Print r
Input s
DeleteObject( hBmp )
Main = r
EndFunction
Function GetImgSquareSize( pImgPath As BytePtr ) As DWord
Dim nWH As DWord
Dim hBmp As DWord
Dim lpBITMAP As BITMAP
Dim pBuf As BytePtr
pBuf = calloc( 256 )
ZeroMemory( pBuf, 256 )
lstrcpy( pBuf, pImgPath )
'↑pImgPathを直にLoadImagePlus()に渡すと、エラーする。
' こうするとエラーしない。原因は不明。
hBmp = LoadImagePlus( pBuf )
DeleteObject( hBmp )
free( pBuf )
EndFunction 'Debugで追っていくと、ここでアクセス違反になる。
Ver4.10.02で試したところ、アクセス違反は起きなくなりましたが、
コードの動作がおかしくなりました。
(関数の途中で勝手に抜けたり、値が代入されなかったり。)
そちらの方は、どういうエラーが起きているのか理解できていません。
≪聞きたいこと≫
上記の方法でなくても、Gif、Jpeg、pngの縦横サイズが
読み取れるのであれば構いません。
直にフォーマットのヘッダ?を読み取ることも考えて
Googleで調べたのですが、仕様は見つけられませんでした・・・。
宜しくご教授お願い致します。