1. ホーム
  2. Web制作
  3. html5

HTML5ページの長押しで画像を保存する機能を解決するための記事

2022-01-31 12:59:42

この記事では、H5で画像を保存するための長押しを実装する方法について詳しく説明します。

画像保存の長押しはH5では非常によくある要件ですが、jsにはその機能がないので、androidやiosのネイティブ機能を使うか、canvasで自分で描くか(スクリーンショット)ですが、ネイティブに比べると高価すぎてアプリに頼らなければならず、広く流通しクロスプラットフォームであるH5には向いていないので、canvasが頼みの綱になったわけです。

以下、詳しい手順を説明します。

1. html2canvasのスクリーンショット

保存する画像ノードはimgタグが望ましい:スクリーンショットを撮りたいノードは、テストしたbackground-imageが少しぼやけることがあり、特別な注意が必要なので、imgタグの画像であることが望ましいです。

npm i html2canvas --save
import html2canvas from 'html2canvas';
// The image node you want to save
const dom = document.querySelector('img');
// Create a new canvas
const Canvas = document.createElement('canvas');
const width = document.body.offsetWidth; // the width of the visible screen
const height = document.body.offsetHeight; // the height of the visible screen
const scale = window.devicePixelRadio; // device's devicePixelRadio
// Scale the Canvas canvas and put it in a smaller screen to solve the blur problem
Canvas.width = width * scale;
Canvas.height = height * scale;
Canvas.getContext('2d').scale(scale, scale);
html2canvas(dom, {
  canvas: Canvas,
  scale,
  useCORS: true,
  logging: true,
  width: width + 'px',
  hegiht: height + 'px',
}).then((canvas) => {
  const context = canvas.getContext('2d');
  // turn off anti-aliasing
  context.mozImageSmoothingEnabled = false;
  context.webkitImageSmoothingEnabled = false;
  context.msImageSmoothingEnabled = false;
  context.imageSmoothingEnabled = false;
  // Convert canvas to image
  canvas2Image(canvas, canvas.width, canvas.height);
});

2. canvas2Imageから画像への変換

一般的にはjpeg形式への変換で十分です。

canvas2Image(canvas, canvas.width, canvas.height) {
  const retCanvas = document.createElement('canvas');
  const retCtx = retCanvas.getContext('2d');
  retCanvas.width = width;
  retCanvas.height = height;
  retCtx.drawImage(canvas, 0, 0, width, height, 0, 0, width, height);
  const img = document.createElement('img');
  img.src = retCanvas.toDataURL('image/jpeg'); // you can change the format as needed
  return img;
}

3. 長押しで画像保存

まず、長押し後に生成された画像を画面上に透過的に浮かせて本文に付加するメソッドを実装します。

// Wrap a long press method
longPress(fn) {
  let timeout = 0;
  const $this = this;
  for (let i = 0; i < $this.length; i++) {
    $this[i].addEventListener('touchstart', () => {
      timeout = setTimeout(fn, 800); // if the long press time exceeds 800ms, then execute the method passed in 
    }, false);
    $this[i].addEventListener('touchend', () => {
      clearTimeout(timeout); // long press time less than 800ms, will not execute the incoming method
    }, false);
  }
}
// Add the generated image to the body
const img = canvas2Image(canvas, canvas.width, canvas.height);
document.body.appendChild(img);
img.style.cssText = "width:100%;height:100%;position:absolute;top:0;left:0;right:0;bottom:0;openness:0;";

4. 完全なコードは次のとおりです。

$.fn.longPress = function(fn) {
  let timeout = 0;
  const $this = this;
  for (let i = 0; i < $this.length; i++) {
    $this[i].addEventListener('touchstart', () => {
      timeout = setTimeout(fn, 800); // if the long press time exceeds 800ms, then execute the method passed in 
    }, false);
    $this[i].addEventListener('touchend', () => {
      clearTimeout(timeout); // long press time less than 800ms, will not execute the incoming method
    }, false);
  }
};
$('img').longPress(() => {
  saveImg();
});saveImg() {
  // The image node you want to save
  const dom = document.querySelector('img');
  // Create a new canvas
  const Canvas = document.createElement('canvas');
  const width = document.body.offsetWidth; // the width of the visible screen
  const height = document.body.offsetHeight; // the height of the visible screen
  const scale = window.devicePixelRatio; // device's devicePixelRatio
  // Scale the Canvas canvas and put it in a smaller screen to solve the blur problem
  Canvas.width = width * scale;
  Canvas.height = height * scale;
  Canvas.getContext('2d').scale(scale, scale);
  html2canvas(dom, {
    canvas: Canvas,
    scale,
    useCORS: true,
    logging: true,
    width: width + 'px',
    hegiht: height + 'px',
  }).then((canvas) => {
    const context = canvas.getContext('2d');
    // turn off anti-aliasing
    context.mozImageSmoothingEnabled = false;
    context.webkitImageSmoothingEnabled = false;
    context.msImageSmoothingEnabled = false;
    context.imageSmoothingEnabled = false;
    // canvas to image conversion
    const img = canvas2Image(canvas, canvas.width, canvas.height);
    document.body.appendChild(img);
    img.style.cssText = "width:100%;height:100%;position:absolute;top:0;left:0;right:0;bottom:0;opacity:0;";
  }
}
canvas2Image(canvas, width, height) {
  const retCanvas = document.createElement('canvas');
  const retCtx = retCanvas.getContext('2d');
  retCanvas.width = width;
  retCanvas.height = height;
  retCtx.drawImage(canvas, 0, 0, width, height, 0, 0, width, height);
  const img = document.createElement('img');
  img.src = retCanvas.toDataURL('image/jpeg'); // you can change the format as needed
  return img;
}

私はちょうどインターネット上の記事の束を行うために始めた、と常に試行錯誤、そして最後に、それはまた、ハを行うことは非常に簡単であることを見つけるために、画像を保存するために長押しの機能を達成するために幸せ、この記事では、プロセス全体を説明し、それを奪う!私は、この記事を読んで、私はそれを行うことができます。

概要

上記は、画像機能を保存するには、HTML5ページの長押しへの徹底的なソリューションであり、私はそれがあなたを助けることを願って、あなたは私にメッセージを与えるために歓迎する任意の質問がある場合、私は速やかに皆に返信されます!.