【最速・最楽】Kindle電子書籍を合法的に画像ファイルにする方法

目次

方法

  • PhoneやiPadの画面収録をしながら、本をパラパラとめくっていく
    • 1ページあたり0.1秒ぐらい止めながらめくる
      • 早すぎるとそのページは画像として残らない
      • 普通に流し読みする程度の早さなら問題ない
画面収録結果の例
  • 収録結果の動画ファイルを以下のpythonスクリプトで変換
    • 入力動画ファイル名はinput_video.mp4決め打ち
import subprocess
import os
import cv2
import numpy as np
from collections import defaultdict

def extract_frames(video_path, output_folder):
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    command = f'ffmpeg -i "{video_path}" "{output_folder}/frame_%05d.png"'
    subprocess.call(command, shell=True)

def compare_frames(frame1, frame2):
    diff = cv2.absdiff(frame1, frame2)
    return np.sum(diff)

def hash_frame(frame):
    # フレームをグレースケールに変換
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # サイズを縮小
    resized = cv2.resize(gray, (8, 8), interpolation=cv2.INTER_AREA)
    # 平均値を計算
    avg = resized.mean()
    # 2値化
    diff = resized > avg
    # ハッシュ値を計算
    return sum([2**i for (i, v) in enumerate(diff.flatten()) if v])

def remove_similar_and_duplicate_frames(folder_path, threshold=2, similarity_threshold=100):
    files = sorted([f for f in os.listdir(folder_path) if f.endswith('.png')])
    prev_frame = None
    static_count = 0
    frames_to_keep = []
    frame_hashes = defaultdict(list)

    for file in files:
        current_frame = cv2.imread(os.path.join(folder_path, file))
        frame_hash = hash_frame(current_frame)
        
        if prev_frame is not None:
            diff = compare_frames(prev_frame, current_frame)
            
            if diff < similarity_threshold:
                static_count += 1
            else:
                static_count = 0

            if static_count >= threshold:
                frame_hashes[frame_hash].append(file)
        else:
            frame_hashes[frame_hash].append(file)

        prev_frame = current_frame

    # 同じハッシュを持つフレームのうち、最初のものだけを保持
    for hash_value, file_list in frame_hashes.items():
        frames_to_keep.append(file_list[0])

    # 不要なフレームを削除
    for file in files:
        if file not in frames_to_keep:
            os.remove(os.path.join(folder_path, file))

def main():
    video_path = 'input_video.mp4'  # 入力動画のパス
    output_folder = 'output_frames'  # 出力フォルダ

    extract_frames(video_path, output_folder)
    remove_similar_and_duplicate_frames(output_folder)

if __name__ == "__main__":
    main()

詳しい説明

pythonスクリプトでやっていること

  • ffmpegで動画をフレームごとにpngファイルに分割保存
  • pngファイルの内容を前後フレームで比較し、1フレームで内容が変わっているpngファイルは消去
  • 2フレーム以上同じ内容が続くpngファイルだけ残るので、同じ内容のものは一つだけ残してあとは消去

合法性について

  • 作った画像を自分自身や家族だけが使う場合、著作権法上の私的利用にあたるため、問題ない
    • いきなり警察に捕まることは無いだろう
  • Kindleの利用規約としては問題がある可能性が高い
    • が、画像化して自分だけで使ったところで、Amazon社からそれを知る手段がないため、現実的にはなにも起こらないだろう
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

TOEICスコア 950(リスニング満点)
東京大学大学院 工学系研究科 卒業
ゲームプログラマー

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次