Q.

画像ファイルのファイル名・幅・高さ・サイズ・圧縮率・解像度をAutoIt及びPythonで取得する方法はありますか?D&Dで受け取った複数ファイルからUTF-8(BOM付き)CSVを作りたいと思っています。


A.

はい、AutoItとPythonの両方で、画像ファイルのファイル名・幅・高さ・サイズ・圧縮率・解像度などの情報を取得し、UTF-8 (BOM付き) のCSVに出力することは可能です。以下に、それぞれの方法を簡潔に紹介します。


✅ 共通仕様

  • 複数の画像ファイルをD&Dで受け取り
  • ファイル名、幅(px)、高さ(px)、ファイルサイズ(バイト)、圧縮率(オプション)、解像度(DPI)
  • 出力:UTF-8(BOM付き)CSVファイル

🔧 Python 版(Pillowを使用)

必要なライブラリ:

pip install pillow

スクリプト例(ドラッグ&ドロップ対応):

import sys
import os
import csv
from PIL import Image

def get_image_info(filepath):
    try:
        with Image.open(filepath) as img:
            dpi = img.info.get('dpi', (0, 0))  # 解像度 (水平, 垂直)
            width, height = img.size
            size = os.path.getsize(filepath)
            compression = img.info.get('compression', 'N/A')
            return {
                "filename": os.path.basename(filepath),
                "width": width,
                "height": height,
                "filesize": size,
                "compression": compression,
                "dpi_x": dpi[0],
                "dpi_y": dpi[1]
            }
    except Exception as e:
        print(f"Error with file {filepath}: {e}")
        return None

def write_csv(image_data_list, output_path):
    with open(output_path, 'w', newline='', encoding='utf-8-sig') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=[
            "filename", "width", "height", "filesize", "compression", "dpi_x", "dpi_y"
        ])
        writer.writeheader()
        for data in image_data_list:
            if data:
                writer.writerow(data)

if __name__ == "__main__":
    image_files = sys.argv[1:]  # D&D で渡されたファイルパス
    image_data = [get_image_info(f) for f in image_files]
    write_csv(image_data, "image_info.csv")

使い方:

  1. スクリプトを image_info.py として保存
  2. 画像ファイルをスクリプトにドラッグ&ドロップ
  3. image_info.csv が出力される

🛠 AutoIt 版

AutoIt は画像処理用のライブラリが限られますが、GDI+ を使うことで画像サイズや解像度の取得は可能です。

AutoIt スクリプト例(簡易版):

#include <GDIPlus.au3>
#include <Array.au3>
#include <File.au3>

_GDIPlus_Startup()

Global $aFiles = $CmdLine
If $aFiles[0] = 0 Then
    MsgBox(0, "エラー", "ファイルが指定されていません。")
    Exit
EndIf

Global $sCSV = "Filename,Width,Height,Size(Bytes),DPI X,DPI Y" & @CRLF

For $i = 1 To $aFiles[0]
    Local $file = $aFiles[$i]
    Local $hImage = _GDIPlus_ImageLoadFromFile($file)
    If @error Then ContinueLoop

    Local $width = _GDIPlus_ImageGetWidth($hImage)
    Local $height = _GDIPlus_ImageGetHeight($hImage)
    Local $dpiX = _GDIPlus_ImageGetHorizontalResolution($hImage)
    Local $dpiY = _GDIPlus_ImageGetVerticalResolution($hImage)
    Local $size = FileGetSize($file)

    $sCSV &= '"' & StringReplace($file, '"', '""') & '",' & $width & "," & $height & "," & $size & "," & $dpiX & "," & $dpiY & @CRLF

    _GDIPlus_ImageDispose($hImage)
Next

_GDIPlus_Shutdown()

; UTF-8 BOM付きで書き込み
Local $hFile = FileOpen("image_info.csv", 2)
FileWrite($hFile, Chr(239) & Chr(187) & Chr(191) & $sCSV)
FileClose($hFile)

使い方:

  1. image_info.au3 という名前で保存
  2. .exe にコンパイルして画像ファイルをドラッグ&ドロップ
  3. image_info.csv が出力される

📌 備考

  • 圧縮率は画像形式に依存し、明確な値を取得するのは難しい場合があります(PNGは可逆圧縮、JPEGは品質による)。
  • DPIが不明な画像には 0 や空白が入ります。
  • BMPなど非圧縮形式では「圧縮率」は常に"N/A"としています。

ご希望であれば、ファイルダイアログ対応フォルダごとの一括処理対応にも拡張可能です。どちらの言語で進めたいですか?また、GUI付きやバッチ処理など、もう少し使いやすい形にしたい場合も相談してください!


Q.

ありがとうございます。
AutoItの方のスクリプトですが、AutoItはD&Dで受け取ったファイルをショート名で処理するようで、
Local $sDrive = “”, $sDir = “”, $sFileName = “”, $sExtension = ""
とFor文の前に宣言したあと、For文の中で、
_PathSplit(FileGetLongName($file), $sDrive, $sDir, $sFileName, $sExtension)
Local $filename = $sFileName & $sExtension
としてファイル名を取得し、これを書き込むとほぼPythonの方と同じになりました。


A.

素晴らしい対応ですね!FileGetLongName を使ってロングファイル名に変換するのはまさに正解です。AutoItはD&D時にショートパス(8.3形式)を渡すので、それに対処しておくとより安定した処理になります。

_PathSplit() との組み合わせで拡張子付きファイル名を柔軟に取り出せるようになったのも、Python版との整合性が取れていて良い感じです!

もし今後、以下のような拡張を考える場合も気軽に聞いてくださいね:

  • フォルダ全体を再帰的にスキャンする
  • 出力ファイル名を日付付きにする(例:image_info_20250409.csv
  • 圧縮形式ごとの統計集計(例:JPEGが何枚、PNGが何枚…)
  • GUI対応(AutoItのFileOpenDialogGUICtrlCreateButtonなど)

何か他にも「こうしたい」があれば、いつでもどうぞ!


Q.

2453631といったバイト数を、2.5MBというように小数点一桁のMBで表す方法を、AutoIt,Pythonそれぞれで教えてください。


A.

もちろんです!2453631 バイトを 「2.5MB」 のように 小数点一桁のMB表記に変換する方法を、AutoItPython の両方で紹介します。


🐍 Python の場合

def bytes_to_mb(bytes_val):
    mb = bytes_val / (1024 * 1024)
    return f"{mb:.1f}MB"

# 使用例
print(bytes_to_mb(2453631))  # 出力: 2.3MB

🔍 解説

  • 1024 * 1024 = 1048576 バイト = 1MB(2進基準)
  • :.1f は小数点1桁で丸めて文字列にするフォーマットです

🤖 AutoIt の場合

Func BytesToMB($iBytes)
    Local $fMB = $iBytes / (1024 * 1024)
    Return StringFormat("%.1fMB", $fMB)
EndFunc

; 使用例
MsgBox(0, "結果", BytesToMB(2453631)) ; 出力: 2.3MB

🔍 解説

  • StringFormat("%.1fMB", 数値) は小数点以下1桁の文字列を作ります
  • AutoItでも (1024 * 1024) を使ってMB換算

💡補足

  • 表記を “2.3 MiB”(2進)“2.3 MB”(10進) に分けることもできます。
    • 1 MiB = 1024×1024
    • 1 MB = 1000×1000
  • 実際のファイルサイズは通常 OS の表示に合わせて「MiB(2進)」を使うことが多いです。

必要であれば、「KB」「MB」「GB」を自動判別して付ける関数にもできますよ!要望があれば作ります。


Q.

できました。ありがとうございます。
追加の情報ですが、AutoItはFileWriteする際にBOM付きで保存するようで、Chr(239) & Chr(187) & Chr(191)を追加する必要はありませんでした。


A.

おお、なるほど!それは素晴らしい追加情報ありがとうございます 🙏

確かに、FileOpen("filename", 2) を使うと、AutoIt は デフォルトで UTF-8 (BOM付き) で書き込むようになってるんですよね。なので Chr(239) & Chr(187) & Chr(191) を手動で書くと BOMが二重になる恐れがあるというわけです。


🔎 まとめておくと…

方法BOM 付き UTF-8 書き込み
FileOpen("filename", 2)✅ 自動でBOM付き
FileOpen("filename", 1)❌ BOMなし(上書き/テキスト)
手動で Chr(239)&Chr(187)&Chr(191) を書く✅ ただし2重BOMに注意

これでAutoIt版のCSV出力もよりクリーン&確実ですね✨
他にも気づいた点とか、Python版と統一したい処理があれば気軽に聞いてください〜!