
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
【PowerPoint】VBAで画像サイズ取得
Visual Basic(VBA)
-
ExcelVBAで画像のサイズを調べるマクロを作ろうと思っています
Access(アクセス)
-
PowerPoint VBA 画像のサイズ
Visual Basic(VBA)
-
4
powerpointマクロでJPEG画像サイズを変更したい
Visual Basic(VBA)
-
5
Excel VBA シェイプの原型のサイズ取得方法
その他(プログラミング・Web制作)
-
6
「RunSQL」と「Execute」の違い
Access(アクセス)
-
7
VBAでJPGサイズ変更
Visual Basic(VBA)
-
8
EXCEL VBAで画像をトリミング
その他(Microsoft Office)
-
9
VBAにGDI+を参照させる方法
Visual Basic(VBA)
-
10
パワポで挿入画像を同じサイズにそろえたい
Excel(エクセル)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
値を返さないコード パス
-
5
[VBA]選択範囲の下から上に処理...
-
6
ASPの変数の値をJAVA Script内...
-
7
vb6のVSFlexGridで選択行、列の...
-
8
マクロ 特定のセル値のみクリ...
-
9
VB2008 iniファイルの指定セク...
-
10
VBのデータの記録の仕方を教え...
-
11
マイコンプログラムでGPS距...
-
12
VB.NETでコンボボックスの1行目...
-
13
変数名の取得
-
14
【C++/CLI.NET】コンボボックス...
-
15
チェックした値を取得したい(C...
-
16
変数が勝手に変わります
-
17
C言語では0は・・・
-
18
FlexGridで複数選択したセル、...
-
19
vbscriptを使いexcelを参照して...
-
20
ExcelでGaussian fittingをした...
おすすめ情報
公式facebook
公式twitter