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.jpgとphoto.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) - 圧縮・タイル化・オーバービューで実運用も軽快
コメント
コメントを投稿