VueとCanvas:写真の美化・削削機能を実装する方法
近年、美化・削削機能は多くの携帯電話のカメラアプリの標準機能となっています。これらの機能により、ユーザーは自分撮り写真を撮るときに自信が持てるだけでなく、写真の品質もある程度向上します。この記事では、VueとCanvasの技術を使って写真の美化や肌の再表面化機能を実現する方法を紹介します。
1. Vue と Canvas を理解する
Vue と Canvas を簡単に紹介します。 Vue は、データを DOM ビューにレンダリングし、データが変更されたときにリアルタイムでビューを更新するユーザー インターフェイスを構築するための進歩的なフレームワークです。 Canvas は HTML5 で新たに追加された描画タグで、グラフィックやアニメーションなどを描画するために使用できます。
2. 準備作業
実装を開始する前に、いくつかの基本的な作業を準備する必要があります。
コマンド ラインに次のコマンドを入力して、Vue プロジェクトを作成します:
vue create beautify-app
次に, src/components ディレクトリ内に Canvas.vue という名前のコンポーネントを作成します。これは、このコンポーネントに Canvas の機能を実装することを意味します。
Canvas.vue に input タグを追加して、ユーザーがアップロードした画像ファイルを受け取ります。
<template> <div> <input type="file" @change="handleImageUpload" /> </div> </template>
3.美化機能の実装
次に、写真の美化機能を実装します。まず、Canvas.vue に美しさのためのフィルター画像を導入する必要があります。
ビューティ フィルターとして使用される、beauty.png という名前の画像をアセット ディレクトリに追加します。
実装されたフック関数では、アップロードされた絵をキャンバス上に描画します。
mounted() { this.canvas = this.$refs.canvas; this.context = this.canvas.getContext('2d'); const image = new Image(); image.src = this.imageUrl; image.onload = () => { this.context.drawImage(image, 0, 0, this.canvas.width, this.canvas.height); }; },
画像を描画した後、Canvas の getImageData
メソッドと putImageData
メソッドを使用して、画像フィルターはアップロードされた画像に適用されます。
applyFilter() { const filterImage = new Image(); filterImage.src = '@/assets/beautify.png'; filterImage.onload = () => { const imageData = this.context.getImageData(0, 0, this.canvas.width, this.canvas.height); const filterContext = this.createFilterContext(filterImage, imageData); this.context.putImageData(filterContext, 0, 0); }; },
このうち、createFilterContext
メソッドは、フィルター効果のコンテキストを作成して返すために使用されます。
4. ダーマブレーション機能の実現
次にダーマブレーション機能を実現します。スキンリサーフェシング機能の実現は主にCanvasのピクセル処理方式に依存します。
Canvas の getImageData
メソッドを使用して、画像のピクセル データを取得できます。
const imageData = this.context.getImageData(0, 0, this.canvas.width, this.canvas.height); const data = imageData.data;
ピクセル データを走査することで、各ピクセルを処理できます。ここでは、ガウスぼかしアルゴリズムを使用してピクセルをぼかすことができます。
for (let i = 0, len = data.length; i < len; i += 4) { const red = data[i]; const green = data[i + 1]; const blue = data[i + 2]; const alpha = data[i + 3]; // 磨皮处理 // ... }
最後に、putImageData
メソッドを使用して、処理されたピクセル データを Canvas 上に描画します。
const resultImageData = new ImageData(data, imageData.width, imageData.height); this.context.putImageData(resultImageData, 0, 0);
5. 機能の改善
上記の手順を完了すると、メソッドを呼び出すことで画像の美化機能と肌の再表面化機能を実現できます。
handleImageUpload
メソッドでは、URL.createObjectURL
メソッドを使用して、次のポインターを生成します。ユーザーが画像の URL をアップロードします。
handleImageUpload(event) { const file = event.target.files[0]; this.imageUrl = URL.createObjectURL(file); },
ボタンのクリック イベントで、applyFilter
メソッドと applySmoothing# をそれぞれ呼び出します。 . ##フィルターと削皮術を適用する方法。
<button @click="applyFilter">应用滤镜</button> <button @click="applySmoothing">应用磨皮</button>
<template> <div> <input type="file" @change="handleImageUpload" /> <button @click="applyFilter">应用滤镜</button> <button @click="applySmoothing">应用磨皮</button> <canvas ref="canvas" :width="canvasWidth" :height="canvasHeight"></canvas> </div> </template> <script> export default { data() { return { imageUrl: '', canvas: null, context: null, canvasWidth: 400, canvasHeight: 300, }; }, mounted() { this.canvas = this.$refs.canvas; this.context = this.canvas.getContext('2d'); }, methods: { handleImageUpload(event) { const file = event.target.files[0]; this.imageUrl = URL.createObjectURL(file); const image = new Image(); image.src = this.imageUrl; image.onload = () => { this.context.drawImage(image, 0, 0, this.canvas.width, this.canvas.height); }; }, applyFilter() { const filterImage = new Image(); filterImage.src = '@/assets/beautify.png'; filterImage.onload = () => { const imageData = this.context.getImageData(0, 0, this.canvas.width, this.canvas.height); const filterContext = this.createFilterContext(filterImage, imageData); this.context.putImageData(filterContext, 0, 0); }; }, applySmoothing() { const imageData = this.context.getImageData(0, 0, this.canvas.width, this.canvas.height); const data = imageData.data; for (let i = 0, len = data.length; i < len; i += 4) { const red = data[i]; const green = data[i + 1]; const blue = data[i + 2]; const alpha = data[i + 3]; // 磨皮处理 // ... } const resultImageData = new ImageData(data, imageData.width, imageData.height); this.context.putImageData(resultImageData, 0, 0); }, createFilterContext(filterImage, imageData) { const filterCanvas = document.createElement('canvas'); filterCanvas.width = this.canvas.width; filterCanvas.height = this.canvas.height; const filterContext = filterCanvas.getContext('2d'); const pattern = filterContext.createPattern(filterImage, 'repeat'); filterContext.fillStyle = pattern; filterContext.fillRect(0, 0, filterCanvas.width, filterCanvas.height); const filterImageData = filterContext.getImageData(0, 0, filterCanvas.width, filterCanvas.height); const filterData = filterImageData.data; const data = imageData.data; for (let i = 0, len = data.length; i < len; i += 4) { data[i] = data[i] * filterData[i] / 255; data[i + 1] = data[i + 1] * filterData[i + 1] / 255; data[i + 2] = data[i + 2] * filterData[i + 2] / 255; } return imageData; }, }, }; </script>
以上がVue と Canvas: 画像の美化と肌のスムージング機能を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。