鏡像効果を実現する JavaScript キャンバス

鏡像効果を実現する JavaScript キャンバス

この記事では、JavaScriptキャンバスでミラーイメージ効果を実現するための具体的なコードを参考までに紹介します。具体的な内容は次のとおりです。

<!DOCTYPE html>
<html>
    <ヘッド>
        <メタ文字セット="utf-8">
        <title>画像の使用</title>
        <スタイル タイプ="text/css">
            * {
                /* マージン: 0;
                パディング: 0; */
                ボックスのサイズ: 境界線ボックス;
            }
            キャンバス {
                /* 境界線の幅: 1px;
                境界線の色: #000000;
                境界線スタイル: solid; */
            }
        </スタイル>
    </head>
    <本文>
        <キャンバスid="キャンバス"></キャンバス>
        <canvas id="ミラー"></canvas>
        
        <div>
            <input type="file" accept="image/*" />
        </div>
        
        <script type="text/javascript">
            window.onload = (イベント) => {
                主要()
            }
            
            関数main() {
                定数キャンバス = document.getElementById("キャンバス");
                ミラーは document.getElementById("ミラー");
                const ctx = canvas.getContext("2d");
                定数 mirrorCtx = mirror.getContext("2d");
                
                定数 inputFile = document.querySelector("input[type=file]");
                inputFile.onchange = (イベント) => {
                    const ファイル = event.target.files;
                    ファイルの長さが 0 より大きい場合
                        const file = files[0]; // 最初のファイル
                        console.log(ファイル);
                        
                        定数image = 新しいImage();
                        image.src = URL.createObjectURL(ファイル);
                        image.onload = 関数(イベント) {
                            // console.log(イベント、これ);
                            URL.revokeObjectURL(this.src);
                            
                            キャンバスの幅 = 画像の幅;
                            キャンバスの高さ = 画像の高さ;
                            ミラーの幅 = 画像の幅;
                            ミラーの高さ = イメージの高さ;
                            
                            ctx.drawImage(画像, 0, 0);
                            
                            const 空の ImageData = ctx.createImageData(canvas.width, canvas.height);
                            const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
                            
                            // console.log(getPixel(imageData, 0, 0));
                            // console.log(getPixel(imageData, 0, 5));
                            // console.log(getPixel(imageData, 0, 9));
                            // console.log(getColor(imageData, 0, 0, "R"));
                            // console.log(getColor(imageData, 0, 5, "G"));
                            // console.log(getColor(imageData, 0, 9, "B"));
                            
                            // コンソールログ(画像データ);
                            
                            // const uint8ClampedArray = imageData.data;
                            // uint8ClampedArray.length = imageData.width * imageData.height * 4;
                            コンソールにログ出力します。
                            for(h = 0; h < imageData.height; h++) {
                                for(let w = 0; w < imageData.width; w++) {
                                    const ピクセル = getPixel(imageData, h, imageData.width - w - 1);
                                    setPixel(空の画像データ、h、w、ピクセル);
                                }
                            }
                            mirrorCtx.putImageData(空のImageData, 0, 0);
                            
                            console.log(画像データ、空の画像データ);
                            
                            関数 getPixel(imageData, 行, 列) {
                                const uint8ClampedArray = imageData.data;
                                定数幅 = imageData.width;
                                定数height = imageData.height;
                                定数ピクセル = [];
                                for(i = 0; i < 4; i++) {
                                    ピクセルをpush(uint8ClampedArray[行 * 幅 * 4 + 列 * 4 + i]);
                                }
                                ピクセルを返します。
                            }
                            
                            関数setPixel(imageData, 行, 列, ピクセル) {
                                const uint8ClampedArray = imageData.data;
                                定数幅 = imageData.width;
                                定数height = imageData.height;
                                for(i = 0; i < 4; i++) {
                                    uint8ClampedArray[行 * 幅 * 4 + 列 * 4 + i] = ピクセル[i];
                                }
                            }
                            
                            // 関数 getColor(imageData, 行, 列, 色) {
                            // const ピクセル = getPixel(imageData, 行, 列);
                            // スイッチ(色) {
                            // ケース "R":
                            // ピクセル[0]を返します。
                            // ケース "G":
                            // ピクセル[1]を返します。
                            // ケース "B":
                            // ピクセル[2]を返します。
                            // ケース "A":
                            // ピクセル[3]を返します。
                            // }
                            // null を返します。
                            // }
                        }
                    }
                }
            }
        </スクリプト>
    </本文>
</html>

参考: リンク

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • 画像の回転、マウスホイールのズーム、ミラーリング、画像切り替えの js コード

<<:  MySQLの詳細な説明Explain

>>:  Docker ベースの nginx ファイル サーバーを構築する方法と手順

推薦する

MYSQL における char と varchar の違い

CHAR 型と VARCHAR 型は似ていますが、主に格納場所、末尾のスペース、取得方法が異なります...

mysql8.x docker リモートアクセスの詳細な設定

目次環境条件エラーが発生しました回避策1. mysql dockerにログインする2. ルートパスワ...

Dockerコンテナとホスト間のデータ相互作用の概要

序文実稼働環境で Docker を使用する場合、多くの場合、データを複数のコンテナ間で永続化または共...

IE8対応のボーダー半径処理方法

canisue (http://caniuse.com/#search=border-radius)...

Linux カーネルの探究: Kconfig の秘密

Linux 構成/ビルド システムがどのように機能するかを深く理解します。 Linux カーネル構成...

CSS 位置プロパティが絶対の場合のパーセンテージ値の計算

位置が絶対の場合、関連する属性のパーセンテージは、参照先の要素 (包含ブロック) を基準として計算さ...

Vue での ElementUI の使用に関する詳細な説明

ログイン + セッションストレージエフェクト表示ログインに成功すると、ユーザー ID がフロントエン...

Alibaba Cloud ECS centos6.8 に MySql5.7 をインストールして設定するチュートリアル

Alibaba Cloud yum コマンドでのデフォルトの MySQL バージョンは 5.17**...

Vuexの特性と機能の詳細な説明

目次Vuex とは何ですか? Vuexの5つの特性vuex の State 機能とは何ですか? vu...

CSSポジションの5つの異なる値の使い方の詳細な説明

位置プロパティposition プロパティは、要素に使用する配置方法のタイプ (静的、相対的、固定、...

この記事では、jsのデータ型とデータ構造の世界を紹介します。

目次1. 動的型付けとは何ですか? 2. データ型2.1 プリミティブ型 (6 つのプリミティブ型、...

CSS の 6 つの重要なセレクター (3 秒で覚える)

出典: https://blog.csdn.net/qq_44761243/article/deta...

Win7 での Mysql 5.7.17 winx64 インストール チュートリアル

ソフトウェア バージョンとプラットフォーム: MySQL-5.7.17-winx64、win7 Ho...

html リンク タグ タイトル属性 改行 マウス ホバー プロンプト コンテンツ 改行効果

オブジェクト上にマウスを移動したときにコンテンツ(タイトル属性の内容)を折り返す方法、HTML タイ...

LinuxはMySQLデータベースの自動バックアップとスケジュールバックアップを毎日実装しています

概要バックアップは災害復旧の基礎であり、システム操作エラーやシステム障害によるデータ損失を防ぐために...