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>
関連記事
-
FileReader APIを用いて画像をアップロードせずにサムネイル表示
以前にFile APIを用いてファイル名やサイズ、形式(拡張子)を取得するメモを ...
-
JavaScriptで画像読み込み完了のタイミングを検知する「imagesLoaded」ライブラリの利用方法
大き目のサイズの画像をページに設置すると読み込み完了まで時間がかかる。その画像が ...
-
javascriptやjQueryで画像を書き換えても変わらない場合
けっこう前に画像をアップロードしてリアルタイムにプレビューする機能を作った時に、 ...
-
Ajaxでプラグイン無しのファイルアップロード方法
画像ファイルを添付できて、尚且つAjaxを用いた非同期通信のフォームを作りたかっ ...
-
jQueryの画像スライダー用プラグイン「slick」の使い方
jQueryの画像スライダー用プラグイン「slick」の使い方についてソースコー ...