• ベストアンサー

ACCESS VBA 画像ファイルの大きさ(幅x高さ)を取得したい

ACCESS VBAで画像ファイルの大きさ(バイト数では無く、ピクセル 幅x高さ)を取得したいです。 やりたい事は”スキャナしたA4、A3混在の複数のTIFF形式のファイル(マルチページ形式では無い)をサイズ判別して、それぞれ別レポートで元のサイズで印刷”です。 用紙サイズの判別に上記の 幅x高さを利用しようと考えています。 バイト数の取得(FileLen)の様な単純な方法は無いですか? いろいろ調べてはみたのですが見付かりませんでした。 初心者ではありますが、どうしても必要なので多少複雑になっても勉強して理解しようと思います。 宜しくお願いします。

  • tmok
  • お礼率66% (2/3)

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

確認してみたら LoadPicture では TIF ファイルを読み込めなかったですね。 すみません。JPG や BMP なら大丈夫ですが・・・ TIF に対応した GDI+ を使った方法を改めて紹介します。 Private Declare Function GdiplusStartup Lib "gdiplus" ( _     ByRef token As Long, _     ByRef inputBuf As GdiplusStartupInput, _     ByVal outputBuf As Long) As Long Private Declare Sub GdiplusShutdown Lib "gdiplus" ( _     ByVal token As Long) Private Declare Function GdipLoadImageFromFile Lib "gdiplus" ( _     ByVal FileName As Long, _     ByRef image As Long) As Long Private Declare Function GdipGetImageDimension Lib "gdiplus" ( _     ByVal image As Long, _     ByRef Width As Single, _     ByRef Height As Single) As Long      Private Type GdiplusStartupInput     GdiplusVersion      As Long     DebugEventCallback    As Long     SuppressBackgroundThread As Long     SuppressExternalCodecs  As Long End Type ' // 画像の幅と高さをピクセルで取得する Public Function GetImageDimensionFromFile( _   ByVal sImageFilePath As String, _   ByRef x As Long, _   ByRef y As Long _ ) As Boolean   '@ 対応フォーマット : BMP, JPG, GIF, TIF, PNG,   Dim uGdiStartupInput As GdiplusStartupInput   Dim nGdiToken    As Long   Dim nStatus     As Long   Dim hImage      As Long   Dim xx        As Single   Dim yy        As Single      x = 0: y = 0   With uGdiStartupInput     .GdiplusVersion = 1   End With   nStatus = GdiplusStartup(nGdiToken, uGdiStartupInput, 0&)   If nStatus = 0 Then     nStatus = GdipLoadImageFromFile(ByVal StrPtr(sImageFilePath), _                     hImage)     If nStatus = 0 Then      nStatus = GdipGetImageDimension(hImage, xx, yy)      If nStatus = 0 Then        GetImageDimensionFromFile = True        x = xx        y = yy      End If     End If     Call GdiplusShutdown(nGdiToken)   End If End Function Sub sample()   Dim x  As Long   Dim y  As Long     If GetImageDimensionFromFile("C:\test3.tif", x, y) Then     MsgBox CStr(x) & " x " & CStr(y) & " pix"   Else     MsgBox "失敗"   End If End Sub

tmok
質問者

お礼

早速のご回答ありがとうございました。 おかげ様で目的のA3、A4の振り分け出力まで完成しました。 数ヶ月越しで悩んでいたので感動です。 流れもだいたい解りすごく勉強になりました。 ありがとうございました。 また何かありましたら宜しくお願い致します。

その他の回答 (2)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

方法はいろいろあると思いますけど、たとえば LoadPicture 関数を使った方法   Dim pic As stdole.IPictureDisp   Set pic = LoadPicture("C:\test.tif") でオブジェクト変数 pic の Width、Height プロパティーで画像の幅や高さを 調べることができます。 ただし、そのままでは HIMETRIC という単位なので、PIXEL に変換してやる 必要がありますよね。VBA の場合、Screen オブジェクトが利用できませんので、 下記のような単位変換のユーザー定義関数を用意することになります。 ' 標準モジュール Private Declare Function GetDC Lib "user32.dll" ( _     ByVal hWnd As Long) As Long Private Declare Function ReleaseDC Lib "user32.dll" ( _     ByVal hWnd As Long, _     ByVal hdc As Long) As Long Private Declare Function GetDeviceCaps Lib "gdi32.dll" ( _     ByVal hdc As Long, _     ByVal nIndex As Long) As Long Private Const LOGPIXELSX As Long = 88 Private Const LOGPIXELSY As Long = 90 ' Himetric --> Pixel 変換関数 Public Function Himetric2PixelX(ByVal x As Long) As Long   Static m As Single   Dim hdc As OLE_HANDLE   If m = 0 Then     hdc = GetDC(0&)     m = GetDeviceCaps(hdc, LOGPIXELSX) / 2540     Call ReleaseDC(0&, hdc)   End If   Himetric2PixelX = CLng(x * m) End Function Public Function Himetric2PixelY(ByVal y As Long) As Long   Static m As Single   Dim hdc As OLE_HANDLE   If m = 0 Then     hdc = GetDC(0&)     m = GetDeviceCaps(hdc, LOGPIXELSY) / 2540     Call ReleaseDC(0&, hdc)   End If   Himetric2PixelY = CLng(y * m) End Function このような関数を用意すればあとは、下記のようなソースでピクセルが求まる と思います。 Sub sample()   Dim pic As stdole.IPictureDisp   Dim x  As Long   Dim y  As Long      Set pic = LoadPicture("C:\test.tif")   x = Himetric2PixelX(pic.Width)   y = Himetric2PixelY(pic.Height)   MsgBox CStr(x) & " x " & CStr(y) & " pix"    End Sub なお、LoadPicture 関数で対応できるファーマットは   bmp, jpg, emf, wmf, gif, ico などだったと思います。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

Sub TIF解析(ファイル名$, 幅&, 高さ&) Dim 位&, 数&, 番&, 済& ReDim 域(0) As Byte 番 = FreeFile Open ファイル名 For Binary As 番 ReDim 域(3) Get 番, 5, 域 位 = 数値化(域) ReDim 域(1) Get 番, 位 + 1, 域 数 = 数値化(域) 位 = 位 + 2 Do Until 数 = 0   ReDim 域(1)   Get 番, 位 + 1, 域   Select Case 数値化(域)     Case &H100 '幅       幅 = 値取得(番, 位)       済 = 済 Or 1     Case &H101 '高さ       高さ = 値取得(番, 位)       済 = 済 Or 2   End Select   If 済 = 3 Then Exit Do   位 = 位 + 12   数 = 数 - 1 Loop Close 番 End Sub Function 値取得&(番&, 位&) ReDim 域(1) As Byte Get 番, 位 + 3, 域 If 数値化(域) = 4 Then ReDim 域(3) Get 番, 位 + 9, 域 値取得 = 数値化(域) End Function Function 数値化&(域() As Byte) Dim 値& 値 = 域(0) + 域(1) * &H100 If UBound(域) > 1 Then   値 = 値 + 域(2) * &H10000 + 域(3) * &H1000000 End If 数値化 = 値 End Function

tmok
質問者

お礼

早速のご回答ありがとうございました。 nda23様のご回答何回で私には難解で未だ解読できていません。 申し訳ございません。 とりあえず目的は達しましたので、今後解読して勉強させて頂きます。 ありがとうございました。 また何かありましたら宜しくお願い致します。

関連するQ&A

  • ACCESS VBA TIFF形式のファイルの解像度を取得したいです。

    ACCESS VBA TIFF形式のファイルの解像度を取得したいです。 以前の書き込みに幅×高さのピクセル値の求め方がかかれてあり、理解しました。 用紙サイズの判別に上記の 幅x高さと解像度を利用しようと考えています。 よろしくお願いします。

  • ExcelVBAでファイルのプロパティを取得

    こんにちは ExcelVBAでファイルのプロパティを取得する方法をお伺いします。 更新日時やファイルサイズの取得についてはいくつか参考にするサイトが見つかりました。 今回知りたいのはJPEGなど画像ファイルの縦横のピクセル数です。ファイルのプロパティとしては「大きさ ○○×△△」「横 ○○ピクセル」「高さ △△ピクセル」と表示される項目です。 これをExcelVBAで取得する方法をお教えください。

  • 640x480 ピクセル内でUPロード用のファイルの作成について

    JPEG形式で640x480 ピクセル内でUPロード用の画像ファイルの作成するようにと指定があるのですが、カタログからスキャナーで画像ファイルを作ろうと思うのですが640x480ピクセル内と言う事が具体的にどうすれば良いのか当方素人のため解りません。どなたかお教え願えませんか? スキャナーはHPの複合機でソフトは付属のHP Image Zoneで出来ないものか?と考えていますが。 尚、WINDOWS XP のノートです。

  • ASP.NETで画像の高さと幅を取得

    ASP.NETでWebページを作成しています。 画像ファイルを読み込んで表示させ、100%、50%・・・ 画像のサイズを拡大縮小させたいと思ってます。 読み込んだ際の画像の高さ幅を元に50%なら1/2と言う 感じで処理できるかなと思っていたのですが、 読み込んだ画像のサイズ(高さ幅)が取得できません。 取得する方法を教えてください。Imageコントロールに そのまま画像URLをセットし表示させてもHeight、Widthが取得できません。 別な方法で画像の表示サイズを変更できるのでしょうか。

  • SAIでスキャナからスキャンした画像について

    絵を描くためにSAIを使うことにしたのですが。いざ使おうとしたところスキャナからスキャンした画像をつかうと「作成・リサイズしようとしているキャンバス(-604045312X268452608,実消費ピクセル数997913K)のサイズが設定された最大サイズ(8208X8208,実消費ピクセル数66049K)を超えています。」というのの後に「キャンバスの読み込みに失敗しました」などというエラーがでます。どうしたらスキャンした画像をつかえるようにできるのでしょうか?教えてほしいです。(-ω-;)スキャナはPM-A870 スキャンのさい使ってるソフトはFILE MANAGER1です。

  • VB6でのファイルサイズ取得について

    VB6ではFileSystemObjectでFileオブジェクトを生成して、 Sizeプロパティからファイルサイズ(バイト)を取得出来ますが、 単純にシーケンシャル入力モードで開いたファイルから、 各行を読み込み、その行の文字列のバイト数を都度加算して行けば 最終的なファイルサイズ(バイト)が取得出来ると考えたのですが、 実際同じ値になりません。 例えば、Sizeプロパティでは、35023バイトのファイルが、 文字列のバイト数を「LenB」で都度加算した場合、 Line Input文で38726バイト、Input文では19363バイトになります。 文字列のバイト数を「Len」で都度加算した場合、 Line Input文で19363バイト、Input文では19361バイトになります。 ファイルは単なるテキストデータです。 なぜ差が出るかの原因を御存知の方教えて頂けませんか? また同じ値になる方法はあるのでしょうか? よろしくお願いします。

  • Tiff形式のファイルが一つだけ見れない。

    Tiff形式のファイルが一つだけ見れない。 Windows XPを使用しています。 A1の図面を、スキャナでとったTiff形式のデータが3つあります。 ファイルのサイズがそれぞれ(1)3.6MB (2)4.5MB (3)2.1MBです。 (1)と(3)はXPのビューアーで見れるのですが、(2)のファイルだけ「表示することができません」とでてきてしまいます。 ☆試してみたこと☆ スキャンしなおし→× photoshopで開く→× リサイズ→できなかった。 (フリーソフトでリサイズしようとしましたが(1)~(3)まで、すべて形式が未対応でできませんでした。TIFFも変換できるソフトだったのに何故でしょう?別のソフトをダウンロードして試してもダメでした。TIFFにもいろんな形式があるんでしょうか??) 画像の変換などにあまり詳しくないので、どうしていいかわかりません。 ちなみに、A1をスキャンできる機械が一つしかないのですが、TIFF形式にしかできないタイプのものです。 どなかたわかるかた いらっしゃいましたら回答願います。

  • A5(タテ)のファイルで背幅の狭いものを探しています!

    A5サイズの分厚い問題集を分冊し、2穴パンチで穴開けしたものを持ち運びたいと考えています。 A5サイズのファイルやバインダー自体、数が少なく、いくつかあるものでもリングの径が大きく、背幅が広いものしか見つかりません。 ファイル自体の背幅が広いとかさ張り、わざわざ問題集を分冊した意味がなくなってしまうので、 A5タテ型サイズ、2穴のものでなるべくスリムなファイルを探しています。 リングがあるのである程度かさ張ってしまうのは仕方ないことですが、 径が小さければ背幅も小さくできると思いますので質問させて頂きました。 ファイルのように中を保護できる表紙があり、A5タテ型2穴の冊子を通せるスリムなノートのような製品はないでしょうか。 お知恵を拝借できればと思います。 どうぞ宜しくお願い致します。

  • photoshop切り抜きツールのサイズがおかしい?!

    photoshop7.0です。 スキャナした画像のふちの部分切り抜き処理した後、そのピクセルサイズが幅3443pixel 高さ4658pixelです。これを他の画像とのサイズに揃えるために切り抜きツールでサイズを幅3239pixel 高さ4662pixelの固定サイズで切り抜く場合、高さが4658pixelで足りないのですがそのまま切り取りをしたら幅3239pixel 高さ4662pixelサイズの画像ファイルになっていました。高さが増えたのでしょうか? どういう意味でしょうか?!

  • パールのファイルサイズ取得について

    パールのファイルサイズ取得について こんにちは。 パールのソースで困っているので、どなたか教えてください。 1つめのファイルサイズと、2つ目のファイルサイズを取得して 比較するソースを書いたのですが、ファイルが0byteであった場合、 変数に入れるところで失敗するのでしょうか? また、変数に入れるところではうまくいったとしても、比較で 失敗するのでしょうか? $size_a = -s $filea; $size_b = -s $fileb; if($size_a == $size_b){ ### メッセージを出力 }

    • ベストアンサー
    • Perl