JPG / PNG / BMP / GIFをGeoTIFF(TFW付き)に一括変換する方法

JPG / PNG / BMP / GIFをGeoTIFF(TFW付き)に一括変換する方法

空中写真やスクリーンショット等の JPG / PNG / BMP / GIF を、座標付きの GeoTIFF(.tif) に一括変換する手順です。
同名のワールドファイル(.jgw, .pgw, .bpw, .gfw, .wld)が隣にあれば、自動的に取り込まれます。変換時に TFW(.tfw) も同時出力します。


対象と前提

  • 対象画像: .jpg, .jpeg, .png, .bmp, .gif
  • オプションで圧縮 (COMPRESS=LZW)、タイル化 (TILED=YES)、TFW出力 (TFW=YES) を有効化
  • ワールドファイルがあれば座標を自動解釈(例: photo.jpgphoto.jgw
  • 座標系(EPSG)はワールドファイルに含まれないため、必要に応じて後述の方法で付与

方法①:コマンド一発(単発変換)

GDAL が入っていれば、1枚だけなら以下でOK。

gdal_translate -of GTiff ^
  -co COMPRESS=LZW -co TILED=YES -co TFW=YES ^
  input.jpg output.tif
  • TFW=YES により output.tfw も生成されます。
  • 同名ワールドファイル(input.jgw など)があれば自動で反映。

方法②:フォルダ内を一括変換(Pythonスクリプト)

フォルダを選ぶだけで、JPG/PNG/BMP/GIFをまとめてGeoTIFF化します。
出力先は「同じフォルダ」または「サブフォルダ(_tif)」に変更可能です。

import os
import tkinter as tk
from tkinter import filedialog
from osgeo import gdal

# ===== 設定(必要なら変更)=====================================
VALID_EXTS = {".jpg", ".jpeg", ".png", ".bmp", ".gif"}
OUTPUT_TO_SUBFOLDER = True   # True: 入力フォルダ下に "_tif" を作ってそこへ出力 / False: 同じ場所に出力
ASSIGN_EPSG = None           # 例: 6668 など。None のままなら付与しない
CREATE_OPTIONS = [
    "COMPRESS=LZW",          # 可逆圧縮
    "TILED=YES",             # タイル化
    "TFW=YES"                # .tfw も出力
]
# ============================================================

def ensure_outdir(input_dir):
    if not OUTPUT_TO_SUBFOLDER:
        return input_dir
    outdir = os.path.join(input_dir, "_tif")
    os.makedirs(outdir, exist_ok=True)
    return outdir

def main():
    root = tk.Tk(); root.withdraw()
    folder = filedialog.askdirectory(title="画像フォルダを選択(JPG/PNG/BMP/GIF)")
    if not folder:
        print("キャンセルしました"); return

    outdir = ensure_outdir(folder)
    print(f"[INFO] 入力: {folder}")
    print(f"[INFO] 出力: {outdir}")

    converted, failed = [], []

    for name in os.listdir(folder):
        in_path = os.path.join(folder, name)
        if not os.path.isfile(in_path):
            continue
        ext = os.path.splitext(name)[1].lower()
        if ext not in VALID_EXTS:
            continue

        stem = os.path.splitext(name)[0]
        out_tif = os.path.join(outdir, stem + ".tif")

        print(f"[RUN ] {name} → {os.path.basename(out_tif)}")
        ds = gdal.Translate(
            out_tif,
            in_path,
            creationOptions=CREATE_OPTIONS,
            outputSRS=(f"EPSG:{ASSIGN_EPSG}" if ASSIGN_EPSG else None)
        )
        if ds is None:
            print(f"[ERR ] 変換失敗: {name}")
            failed.append(in_path)
        else:
            ds = None
            converted.append(out_tif)

    print("\\n===== 結果 =====")
    print(f"変換成功: {len(converted)} 件")
    for p in converted: print("  -", p)
    if failed:
        print(f"失敗: {len(failed)} 件")
        for p in failed: print("  -", p)

if __name__ == "__main__":
    main()

ポイント

  • GDALは同名ワールドファイルがあれば自動で参照します(.jgw/.pgw/.bpw/.gfw/.wld)。
  • ASSIGN_EPSG を設定すれば、変換と同時に座標系(EPSG)を付与できます。
  • COMPRESS=LZW + TILED=YES はQGISでも快適に動く定番設定です。

座標系(EPSG)の付与・確認

ワールドファイルには投影情報が無いため、必要に応じてEPSGを付与します。

# 既存の GeoTIFF に後付けする場合
gdal_edit.py -a_srs EPSG:6668 photo.tif

# 中身確認
gdalinfo photo.tif
  • 例:JGD2011 平面直角系(帯域によりEPSGコードは異なる)
  • 付与後はQGISの「レイヤプロパティ → 情報」で投影が入っているか確認

よくある質問

  • Q: .tfw が出てこない
    → 上のスクリプト・コマンドは TFW=YES で出力します。既存のGeoTIFFからTFWだけ作りたい場合は、
    gdal_translate -of GTiff -co TFW=YES input.tif output.tif として再書き出しします(中身は劣化しません)。
  • Q: 変換後に色がおかしい/サイズが大きい
    → 8bit RGBであればそのままOK。容量が大きい場合は COMPRESS=LZW の他に、16bit画像なら PREDICTOR=2 を追加すると圧縮効率が上がることがあります。
    例:-co COMPRESS=LZW -co PREDICTOR=2 -co TILED=YES
  • Q: 表示が重い
    → 変換後にピラミッド(オーバービュー)を付けると高速化します。
    gdaladdo -r average photo.tif 2 4 8 16

まとめ

  • JPG/PNG/BMP/GIFをワンクリックでGeoTIFF化(TFW同時出力)
  • 同名ワールドファイルがあれば自動で座標を取り込み
  • 必要に応じてEPSGを付与(gdal_edit.py -a_srs
  • 圧縮・タイル化・オーバービューで実運用も軽快

コメント

このブログの人気の投稿

石川県:土砂災害(特別)警戒区域+CS立体図

日本でよく使う EPSG コード 一覧

設計定数を求めるための代表N値について