
ACCESS VBAで画像ファイルの大きさ(バイト数では無く、ピクセル 幅x高さ)を取得したいです。
やりたい事は”スキャナしたA4、A3混在の複数のTIFF形式のファイル(マルチページ形式では無い)をサイズ判別して、それぞれ別レポートで元のサイズで印刷”です。
用紙サイズの判別に上記の 幅x高さを利用しようと考えています。
バイト数の取得(FileLen)の様な単純な方法は無いですか?
いろいろ調べてはみたのですが見付かりませんでした。
初心者ではありますが、どうしても必要なので多少複雑になっても勉強して理解しようと思います。
宜しくお願いします。
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
早速のご回答ありがとうございました。
おかげ様で目的のA3、A4の振り分け出力まで完成しました。
数ヶ月越しで悩んでいたので感動です。
流れもだいたい解りすごく勉強になりました。
ありがとうございました。
また何かありましたら宜しくお願い致します。
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
などだったと思います。
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
早速のご回答ありがとうございました。
nda23様のご回答何回で私には難解で未だ解読できていません。
申し訳ございません。
とりあえず目的は達しましたので、今後解読して勉強させて頂きます。
ありがとうございました。
また何かありましたら宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Access VBA を利用して、フォルダ内のファイルの名称を変更したい 1 2023/08/03 08:27
- Excel(エクセル) エクセル、画像ファイル名の書かれたセル(複数個所)に画像を一括で表示させる方法 1 2023/04/19 00:19
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- その他(プログラミング・Web制作) 【GAS】Gmail本文をブラウザ表示された状態でPDFにしたいです 1 2022/12/12 09:54
- Excel(エクセル) excelの列幅高さが勝手に変わる(特定のPCだけ) 8 2022/07/14 16:51
- Excel(エクセル) エクセルでcsvファイルを開いてVBAを使いたい 7 2022/04/28 11:12
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- 画像編集・動画編集・音楽編集 動画をディスク作成すると画像が乱れる。 4 2022/06/24 07:49
- Excel(エクセル) Excel 毎日手作業で時間がかかって、泣きたいです、、、VBAのプロの方、助けてください。。。 3 2022/10/25 04:26
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vba Array関数について教えてく...
-
【マクロ】シートの変数へ入れ...
-
【マクロ】並び替えの範囲が、...
-
エクセルのVBAコードと数式につ...
-
エクセルのマクロについて教え...
-
エクセルの改行について
-
【VBA】 結合セルに複数画像と...
-
vbsでのwebフォームへの入力制限?
-
算術演算子「¥」の意味について
-
【マクロ】売上一覧YYYYMMDDHHS...
-
【マクロ】開いているブックの...
-
Vba セルの4辺について罫線が有...
-
vb.net(vs2022)のtextboxのデザ...
-
ダブルクリックで貼り付けた画...
-
VBAの「To」という語句について
-
VBAでユーザーフォームを指定回...
-
VBAでCOPYを繰り返すと、処理が...
-
【マクロ】変数を使った、文字...
-
エクセルのVBAコードについて教...
-
ワードの図形にマクロを登録で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Vba セルの4辺について罫線が有...
-
vbsでのwebフォームへの入力制限?
-
【ExcelVBA】5万行以上のデー...
-
【マクロ】売上一覧YYYYMMDDHHS...
-
【マクロ】開いているブックの...
-
【マクロ】並び替えの範囲が、...
-
エクセルの改行について
-
エクセルのマクロについて教え...
-
vb.net(vs2022)のtextboxのデザ...
-
VBAでCOPYを繰り返すと、処理が...
-
VBA ユーザーフォーム ボタンク...
-
エクセルのVBAコードと数式につ...
-
エクセルのVBAコードについて教...
-
[VB.net] ボタン(Flat)のEnable...
-
【マクロ】変数を使った、文字...
-
改行文字「vbCrLf」とは
-
質問58753 このコードでうまく...
-
【マクロ】シートの変数へ入れ...
-
ワードの図形にマクロを登録で...
-
算術演算子「¥」の意味について
おすすめ情報