勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

PHPで画像を分割し並べ替えて出力したものをJavaScriptで復元する方法

  PHP JavaScript

ある電子書籍サイトをブラウザの開発者ツールで見てみたところ、PHPでページ画像を分割し並べ替えたものを出力し、それをブラウザ側で元の状態に戻しているように見受けられた(恐らくダウンロードやスクレイピング対策)。これを再現してみたい。以下にサンプルとソースコードをメモ。

 

サンプル

元画像

https://taitan916.info/sample/split_restoration_img/001.png

PHPで画像を分割し並べ替えて出力

https://taitan916.info/sample/split_restoration_img/split.php

JavaScriptで元の状態に戻して出力

https://taitan916.info/sample/split_restoration_img/restoration.html

 

ソースコード

PHPで画像を分割し並べ替えて出力

<?php
//対象の画像
$img = '001.png';

//対象の画像サイズを取得
$img_size = getimagesize($img);
$img_width = $img_size[0];
$img_height = $img_size[1];

//新しい画像をファイルから作成
$src_img = imagecreatefrompng($img);

//TrueColorイメージを新規に作成する
$dst_img = imagecreatetruecolor($img_width, $img_height);

//分割数
$parts_count = 3;

//分割用のサイズを取得
$parts_width = floor($img_width / $parts_count);
$parts_height = floor($img_height / $parts_count);

//ループで画像を分割処理
for( $i = 0; $i < $parts_count; $i++){
    for( $ii = 0; $ii < $parts_count; $ii++){
        imagecopyresampled(
            $dst_img, 
            $src_img, 
            $parts_width * $i, 
            $parts_height * $ii, 
            $parts_width * $ii, 
            $parts_height * $i, 
            $parts_width, 
            $parts_height, 
            $parts_width, 
            $parts_height
        );
    }
}

//画像の出力
header('Content-Type: image/png');
imagepng($dst_img);

JavaScriptで元の状態に戻して出力

<canvas id="canvas"></canvas>

<script type="text/javascript">
const canvas = document.getElementById(`canvas`);
if( canvas.getContext ){
    const ctx = canvas.getContext(`2d`);

    const img = new Image();

    //画像の取得
    img.src = `./split.php`;

    img.onload = function(){

        //canvasのwidthとheightを指定
        canvas.setAttribute(`width`, img.width.toString());
        canvas.setAttribute(`height`, img.height.toString());

        //分割数
        const parts_count = 3;

        //分割用のサイズを取得
        const parts_width = Math.round(img.width / parts_count);
        const parts_height = Math.round(img.height / parts_count);
        console.log(parts_width);

        //ループで画像を復元処理
        for(let i = 0; i < parts_count; i++){
            for(let ii = 0; ii < parts_count; ii++){
                ctx.drawImage(
                    img, 
                    parts_width * i, 
                    parts_height * ii, 
                    parts_width, 
                    parts_height, 
                    parts_width * ii, 
                    parts_height * i, 
                    parts_width, 
                    parts_height
                );
            }
        }
    }
}
</script>

 - PHP JavaScript

  関連記事

CKEditor5(WYSIWYGエディタ)に画像アップロード機能を追加する方法

CKEditor5(ウィジウィグエディタ)に画像アップロード機能を追加したい。公 ...

バニラJS対応(jQuery非依存)の画像スライダー系プラグイン「Flickity」の利用方法

画像スライダーを設置する場合「slick」プラグインを利用することが多い。ただ、 ...

画像にマウスを合わせると拡大表示させる「drift」ライブラリの利用方法

amazon等ECサイトで商品画像にマウスを合わせると当該部分が拡大表示されると ...

Ajaxでプラグイン無しのファイルアップロード方法

画像ファイルを添付できて、尚且つAjaxを用いた非同期通信のフォームを作りたかっ ...

ライブラリ等を使用せずファイルをドラッグ&ドロップでアップロードする方法

formにドラッグ&ドロップでファイルをアップロードする機能を実装する場 ...