웹 프론트엔드 CSS 튜토리얼 캔버스를 사용하여 픽셀을 조작하는 방법

캔버스를 사용하여 픽셀을 조작하는 방법

Jun 14, 2018 pm 04:02 PM
canvas 픽셀

이 글에서는 Canvas를 사용하여 픽셀을 조작하는 방법에 대한 관련 정보를 주로 소개합니다. 내용이 꽤 좋아서 지금 공유하고 참고하겠습니다.

최신 브라우저는 <video> 요소를 통해 비디오 재생을 지원합니다. 대부분의 브라우저는 MediaDevices.getUserMedia() API를 통해 카메라에 액세스할 수도 있습니다. 하지만 이 두 가지가 결합되더라도 우리는 이 픽셀에 직접 접근하거나 조작할 수 없습니다. <video>元素播放视频。大多数浏览器也可以通过 MediaDevices.getUserMedia()API访问摄像头。但即使这两件事结合起来,我们也无法直接访问和操纵这些像素。

幸运的是,浏览器有一个Canvas API,允许我们使用JavaScript绘制图形。实际上,我们可以从视频本身将图像绘制到 <canvas>

다행히도 브라우저에는 JavaScript를 사용하여 그래픽을 그릴 수 있는 Canvas API가 있습니다. 실제로 비디오 자체에서 <캔버스>에 이미지를 그릴 수 있으며 이를 통해 해당 픽셀을 조작하고 표시할 수 있습니다.

여기에서 픽셀을 조작하는 방법에 대해 배우는 내용은 캔버스뿐만 아니라 모든 종류 또는 소스의 이미지와 비디오 작업을 위한 기초를 제공합니다.

캔버스에 이미지 추가

영상을 시작하기 전에 캔버스에 이미지를 추가하는 방법을 살펴보겠습니다.

<img src>
<p>
  <canvas id="Canvas" class="video"></canvas>
</p>
로그인 후 복사

캔버스에 그릴 이미지를 표현하는 이미지 요소를 생성합니다. 또는 JavaScript에서 Image 객체를 사용할 수 있습니다.

var canvas;
var context;

function init() {
  var image = document.getElementById(&#39;SourceImage&#39;);
  canvas = document.getElementById(&#39;Canvas&#39;);
  context = canvas.getContext(&#39;2d&#39;);

  drawImage(image);
  // Or
  // var image = new Image();
  // image.onload = function () {
  //    drawImage(image);
  // }
  // image.src = &#39;image.jpg&#39;;
}

function drawImage(image) {
  // Set the canvas the same width and height of the image
  canvas.width = image.width;
  canvas.height = image.height;

  context.drawImage(image, 0, 0);
}

window.addEventListener(&#39;load&#39;, init);
로그인 후 복사

위 코드는 전체 이미지를 캔버스에 그립니다.

CodePen에서 Welling Guzman(@wellingguzman)을 통해 캔버스 이미지를 봅니다.

이제 해당 픽셀을 가지고 놀 수 있습니다.

이미지 데이터 업데이트

캔버스의 이미지 데이터를 사용하여 픽셀을 조작하고 변경할 수 있습니다.

data 속성은 너비, 높이 및 데이터의 세 가지 속성을 갖는 ImageData 객체입니다. 이 속성은 모두 원본 이미지를 기반으로 하며 Uint8ClampedArray로 표시되는 1차원 배열입니다.

데이터 속성이 읽기 전용이지만 해당 값을 변경할 수 없다는 의미는 아닙니다. 이는 이 속성에 다른 배열이 할당된다는 의미입니다.

// Get the canvas image data
var imageData = context.getImageData(0, 0, canvas.width, canvas.height);

image.data = new Uint8ClampedArray(); // WRONG
image.data[1] = 0; // CORRECT
로그인 후 복사

Uint8ClampedArray 객체는 어떤 값을 나타내는지 궁금하실 겁니다. MDN의 설명은 다음과 같습니다.

Uint8ClampedArray 유형 배열은 0-으로 고정된 8비트 부호 없는 정수 배열을 나타냅니다. 255, [0,255] 범위 밖의 값을 지정하면 0 또는 255가 설정되고, 정수가 아닌 값을 지정하면 가장 가까운 정수가 0으로 설정됩니다. 일단 설정되면 객체를 참조하는 방법을 사용할 수 있습니다. 배열의 요소 또는 표준 배열 인덱싱 구문 사용(예: 대괄호 표기법 사용)

간단히 말하면 이 배열은 각 위치에 0에서 255 사이의 값을 저장하므로 RGBA 형식이 됩니다. 각 부분이 다음과 같이 표현되므로 완벽한 솔루션입니다. 0에서 255 사이의 값입니다.

RGBA 색상

색상은 빨간색, 녹색 및 파란색의 조합인 RGBA 형식으로 표현할 수 있습니다. 알파 A는 색상 불투명도 값을 나타냅니다. 색상(픽셀) 채널 값

  • 첫 번째 위치는 빨간색 값

  • 두 번째 위치는 녹색 값

  • 파란색 값

  • 네 번째 위치는 알파 값

  • 5번째 위치는 다음 픽셀의 빨간색 값

  • 6번째 위치는 다음 픽셀의 녹색 값

  • 7번째 위치는 다음 픽셀의 파란색 값

  • 8번째 위치는 다음 픽셀 알파 값

  • 등...

2x2 이미지가 있으면 16비트 배열(각각 2x2 픽셀 x 4개 값)이 있습니다.

2x2 이미지 축소

배열은 다음과 같습니다.

픽셀 데이터 변경

가장 빠른 작업 중 하나는 모든 RGBA 값을 255로 변경하여 모든 픽셀을 흰색으로 설정하는 것입니다.

// RED                 GREEN                BLUE                 WHITE
[ 255, 0, 0, 255,      0, 255, 0, 255,      0, 0, 255, 255,      255, 255, 255, 255]
로그인 후 복사

데이터는 참조로 전달됩니다. 즉, 데이터를 수정하면 전달된 매개변수의 값이 변경됩니다.

색상 반전

많은 계산이 필요하지 않은 훌륭한 효과는 다음과 같습니다. 이미지의 색상을 반전시킵니다.

색상 값은 XOR 연산자(^) 또는 이 공식 255 - 값(값은 0-255 사이여야 함)을 사용하여 반전될 수 있습니다.

// Use a button to trigger the "effect"
var button = document.getElementById(&#39;Button&#39;);

button.addEventListener(&#39;click&#39;, onClick);

function changeToWhite(data) {
  for (var i = 0; i < data.length; i++) {
    data[i] = 255;
  }
}

function onClick() {
  var imageData = context.getImageData(0, 0, canvas.width, canvas.height);

  changeToWhite(imageData.data);

  // Update the canvas with the new data
  context.putImageData(imageData, 0, 0);
}
로그인 후 복사

이전처럼 루프를 1이 아닌 4씩 증가시켜 배열의 요소 4개를 픽셀에서 픽셀로, 각 픽셀을 채울 수 있습니다.

알파 값은 색상 반전에 영향을 주지 않으므로 건너뜁니다.

밝기 및 대비

다음 공식을 사용하여 이미지의 밝기를 조정하세요: newValue = currentValue + 255 * (밝기 / 100).

밝기는 -100에서 100 사이여야 합니다.

    currentValue는 빨간색, 녹색 또는 파란색에 대한 현재 조명 값입니다.
  1. newValue는 현재 색상의 빛과 밝기의 결과입니다.
  2. 이미지의 대비 조정은 다음 공식으로 수행할 수 있습니다.
  3. function invertColors(data) {
      for (var i = 0; i < data.length; i+= 4) {
        data[i] = data[i] ^ 255; // Invert Red
        data[i+1] = data[i+1] ^ 255; // Invert Green
        data[i+2] = data[i+2] ^ 255; // Invert Blue
      }
    }
    
    function onClick() {
      var imageData = context.getImageData(0, 0, canvas.width, canvas.height);
    
      invertColors(imageData.data);
    
      // Update the canvas with the new data
      context.putImageData(imageData, 0, 0);
    }
    로그인 후 복사

  4. 주요 계산은 다음과 같은 대비를 얻는 것입니다. 각 색상 값 요소에 적용됩니다. 잘림은 값이 0에서 255 사이에 유지되도록 하는 기능입니다.

다음 함수를 JavaScript로 작성해 보겠습니다.

function applyBrightness(data, brightness) {
  for (var i = 0; i < data.length; i+= 4) {
    data[i] += 255 * (brightness / 100);
    data[i+1] += 255 * (brightness / 100);
    data[i+2] += 255 * (brightness / 100);
  }
}

function truncateColor(value) {
  if (value < 0) {
    value = 0;
  } else if (value > 255) {
    value = 255;
  }

  return value;
}

function applyContrast(data, contrast) {
  var factor = (259.0 * (contrast + 255.0)) / (255.0 * (259.0 - contrast));

  for (var i = 0; i < data.length; i+= 4) {
    data[i] = truncateColor(factor * (data[i] - 128.0) + 128.0);
    data[i+1] = truncateColor(factor * (data[i+1] - 128.0) + 128.0);
    data[i+2] = truncateColor(factor * (data[i+2] - 128.0) + 128.0);
  }
}
로그인 후 복사

在这种情况下,您不需要truncateColor函数,因为Uint8ClampedArray会截断这些值,但为了翻译我们在其中添加的算法。

需要记住的一点是,如果应用亮度或对比度,则图像数据被覆盖后无法回到之前的状态。如果我们想要重置为原始状态,则原始图像数据必须单独存储以供参考。保持图像变量对其他函数可访问将会很有帮助,因为您可以使用该图像来重绘画布和原始图像。

var image = document.getElementById(&#39;SourceImage&#39;);

function redrawImage() {
  context.drawImage(image, 0, 0);
}
로그인 후 복사

使用视频

为了使它适用于视频,我们将采用我们的初始图像脚本和HTML代码并做一些小的修改。

HTML

通过替换以下行来更改视频元素的Image元素:

 <img src>
로그인 후 복사

...with this:

<video src></video>
로그인 후 복사

JavaScript

替换这一行:

var image = document.getElementById(&#39;SourceImage&#39;);
로그인 후 복사

...添加这行:

var video = document.getElementById(&#39;SourceVideo&#39;);
로그인 후 복사

要开始处理视频,我们必须等到视频可以播放。

video.addEventListener(&#39;canplay&#39;, function () {
    // Set the canvas the same width and height of the video
    canvas.width = video.videoWidth;
    canvas.height = video.videoHeight;    

    // Play the video
    video.play();

    // start drawing the frames  
    drawFrame(video);
});
로그인 후 복사

当有足够的数据可以播放媒体时,至少在几帧内播放事件播放。

我们无法看到画布上显示的任何视频,因为我们只显示第一帧。我们必须每n毫秒执行一次drawFrame以跟上视频帧速率。

在drawFrame内部,我们每10ms再次调用drawFrame。

function drawFrame(video) {
  context.drawImage(video, 0, 0);

  setTimeout(function () {
    drawFrame(video);
  }, 10);
}
로그인 후 복사

在执行drawFrame之后,我们创建一个循环,每10ms执行一次drawFrame - 足够的时间让视频在画布中保持同步。

将效果添加到视频

我们可以使用我们之前创建的相同函数来反转颜色:

function invertColors(data) {
  for (var i = 0; i < data.length; i+= 4) {
    data[i] = data[i] ^ 255; // Invert Red
    data[i+1] = data[i+1] ^ 255; // Invert Green
    data[i+2] = data[i+2] ^ 255; // Invert Blue
  }
}
로그인 후 복사

并将其添加到drawFrame函数中:

function drawFrame(video) {
  context.drawImage(video, 0, 0);

  var imageData = context.getImageData(0, 0, canvas.width, canvas.height);
  invertColors(imageData.data);
  context.putImageData(imageData, 0, 0);

  setTimeout(function () {
    drawFrame(video);
  }, 10);
}
로그인 후 복사

我们可以添加一个按钮并切换效果:

function drawFrame(video) {
  context.drawImage(video, 0, 0);

  if (applyEffect) {
    var imageData = context.getImageData(0, 0, canvas.width, canvas.height);
    invertColors(imageData.data);
    context.putImageData(imageData, 0, 0);
  }

  setTimeout(function () {
    drawFrame(video);
  }, 10);
}
로그인 후 복사

使用 camera

我们将保留我们用于视频的相同代码,唯一不同的是我们将使用MediaDevices.getUserMedia将视频流从文件更改为相机流。

MediaDevices.getUserMedia是弃用先前API MediaDevices.getUserMedia()的新API。浏览器仍旧支持旧版本,并且某些浏览器不支持新版本,我们必须求助于polyfill以确保浏览器支持其中一种。

首先,从视频元素中删除src属性:

<video><code>
<code>// Set the source of the video to the camera stream
function initCamera(stream) {
    video.src = window.URL.createObjectURL(stream);
}

if (navigator.mediaDevices.getUserMedia) {
  navigator.mediaDevices.getUserMedia({video: true, audio: false})
    .then(initCamera)
    .catch(console.error)
  );
}
로그인 후 복사

Live Demo

效果

到目前为止,我们所介绍的所有内容都是我们需要的基础,以便为视频或图像创建不同的效果。我们可以通过独立转换每种颜色来使用很多不同的效果。

灰阶

将颜色转换为灰度可以使用不同的公式/技巧以不同的方式完成,以避免陷入太深的问题我将向您展示基于GIMP desaturate tool去饱和工具和Luma的五个公式:

Gray = 0.21R + 0.72G + 0.07B // Luminosity
Gray = (R + G + B) ÷ 3 // Average Brightness
Gray = 0.299R + 0.587G + 0.114B // rec601 standard
Gray = 0.2126R + 0.7152G + 0.0722B // ITU-R BT.709 standard
Gray = 0.2627R + 0.6780G + 0.0593B // ITU-R BT.2100 standard
로그인 후 복사

我们想要使用这些公式找到的是每个像素颜色的亮度等级。该值的范围从0(黑色)到255(白色)。这些值将创建灰度(黑白)效果。

这意味着最亮的颜色将最接近255,最暗的颜色最接近0。

Live Demo

双色调

双色调效果和灰度效果的区别在于使用了两种颜色。在灰度上,您有一个从黑色到白色的渐变色,而在双色调中,您可以从任何颜色到任何其他颜色(从蓝色到粉红色)都有一个渐变。

使用灰度的强度值,我们可以将其替换为梯度值。

我们需要创建一个从ColorA到ColorB的渐变。

function createGradient(colorA, colorB) {   
  // Values of the gradient from colorA to colorB
  var gradient = [];
  // the maximum color value is 255
  var maxValue = 255;
  // Convert the hex color values to RGB object
  var from = getRGBColor(colorA);
  var to = getRGBColor(colorB);

  // Creates 256 colors from Color A to Color B
  for (var i = 0; i <= maxValue; i++) {
    // IntensityB will go from 0 to 255
    // IntensityA will go from 255 to 0
    // IntensityA will decrease intensity while instensityB will increase
    // What this means is that ColorA will start solid and slowly transform into ColorB
    // If you look at it in other way the transparency of color A will increase and the transparency of color B will decrease
    var intensityB = i;
    var intensityA = maxValue - intensityB;

    // The formula below combines the two color based on their intensity
    // (IntensityA * ColorA + IntensityB * ColorB) / maxValue
    gradient[i] = {
      r: (intensityA*from.r + intensityB*to.r) / maxValue,
      g: (intensityA*from.g + intensityB*to.g) / maxValue,
      b: (intensityA*from.b + intensityB*to.b) / maxValue
    };
  }

  return gradient;
}

// Helper function to convert 6digit hex values to a RGB color object
function getRGBColor(hex)
{
  var colorValue;

  if (hex[0] === &#39;#&#39;) {
    hex = hex.substr(1);
  }

  colorValue = parseInt(hex, 16);

  return {
    r: colorValue >> 16,
    g: (colorValue >> 8) & 255,
    b: colorValue & 255
  }
}
로그인 후 복사

简而言之,我们从颜色A创建一组颜色值,降低强度,同时转到颜色B并增加强度。

从 #0096ff 到 #ff00f0

var gradients = [
  {r: 32, g: 144, b: 254},
  {r: 41, g: 125, b: 253},
  {r: 65, g: 112, b: 251},
  {r: 91, g: 96, b: 250},
  {r: 118, g: 81, b: 248},
  {r: 145, g: 65, b: 246},
  {r: 172, g: 49, b: 245},
  {r: 197, g: 34, b: 244},
  {r: 220, g: 21, b: 242},
  {r: 241, g: 22, b: 242},
];
로그인 후 복사

缩放颜色过渡的表示

上面有一个从#0096ff到#ff00f0的10个颜色值的渐变示例。

颜色过渡的灰度表示

现在我们已经有了图像的灰度表示,我们可以使用它将其映射到双色调渐变值。

The duotone gradient has 256 colors while the grayscale has also 256 colors ranging from black (0) to white (255). That means a grayscale color value will map to a gradient element index.

var gradientColors = createGradient(&#39;#0096ff&#39;, &#39;#ff00f0&#39;);
var imageData = context.getImageData(0, 0, canvas.width, canvas.height);
applyGradient(imageData.data);

for (var i = 0; i < data.length; i += 4) {
  // Get the each channel color value
  var redValue = data[i];
  var greenValue = data[i+1];
  var blueValue = data[i+2];

  // Mapping the color values to the gradient index
  // Replacing the grayscale color value with a color for the duotone gradient
  data[i] = gradientColors[redValue].r;
  data[i+1] = gradientColors[greenValue].g;
  data[i+2] = gradientColors[blueValue].b;
  data[i+3] = 255;
}
로그인 후 복사

Live Demo

结论

这个主题可以更深入或解释更多的影响。为你做的功课是找到可以应用于这些骨架示例的不同算法。

了解像素在画布上的结构将允许您创建无限数量的效果,如棕褐色,混色,绿色屏幕效果,图像闪烁/毛刺等。

您甚至可以在不使用图像或视频的情况下即时创建效果

위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되길 바랍니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 참고해주세요!

관련 권장 사항:

캔버스 선의 속성 정보

캔버스를 사용하여 이미지 모자이크를 얻는 방법

위 내용은 캔버스를 사용하여 픽셀을 조작하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

김프에서 픽셀 아트를 만드는 방법 김프에서 픽셀 아트를 만드는 방법 Feb 19, 2024 pm 03:24 PM

Windows에서 픽셀 아트 제작을 위해 김프를 사용하는 데 관심이 있다면 이 기사가 흥미로울 것입니다. GIMP는 무료 오픈 소스일 뿐만 아니라 사용자가 아름다운 이미지와 디자인을 쉽게 만들 수 있도록 도와주는 잘 알려진 그래픽 편집 소프트웨어입니다. 초보자와 전문 디자이너 모두에게 적합할 뿐만 아니라, 김프는 그리기와 창작을 위한 유일한 구성 요소로 픽셀을 활용하는 디지털 아트의 한 형태인 픽셀 아트를 만드는 데에도 사용할 수 있습니다. 김프에서 픽셀 아트를 만드는 방법 Windows PC에서 김프를 사용하여 픽셀 그림을 만드는 주요 단계는 다음과 같습니다. 김프를 다운로드하여 설치한 다음 응용 프로그램을 시작합니다. 새 이미지를 만듭니다. 너비와 높이의 크기를 조정합니다. 연필 도구를 선택합니다. 브러시 유형을 픽셀로 설정합니다. 설정

Meitu Xiu Xiu에서 픽셀을 변경하는 방법 Meitu Xiu Xiu에서 픽셀을 변경하는 방법 Meitu Xiu Xiu에서 픽셀을 변경하는 방법 Meitu Xiu Xiu에서 픽셀을 변경하는 방법 Mar 12, 2024 pm 02:50 PM

Meitu Xiuxiu의 픽셀을 변경하는 방법은 무엇입니까? Meitu Xiuxiu는 다양한 기능을 갖춘 모바일 사진 편집 소프트웨어로 사용자에게 뛰어난 사진 편집 경험을 제공하는 데 전념하고 있습니다. 소프트웨어에서는 인물 미용, 피부 미백, 얼굴 모양 변경, 얼굴 슬리밍 등과 같은 다양한 작업을 사진에 수행할 수 있습니다. 만족스럽지 않으면 클릭하기만 하면 쉽게 완벽한 비율을 만들 수 있습니다. 복구된 사진의 경우 저장하기 전에 크기와 픽셀을 조정할 수도 있습니다. 그럼 픽셀화하는 방법을 아시나요? 아직 모르시는 분들을 위해 아래 에디터가 공유한 방법을 살펴보겠습니다. MeituXiuXiu의 픽셀을 변경하는 방법 1. MeituXiuXiu를 두 번 클릭하여 열고 "사진 꾸미기" 옵션을 클릭하여 선택합니다. 2. 사진 꾸미기에서 "크기"를 클릭합니다.

Meitu Xiuxiu의 픽셀 높이를 설정하는 방법 Meitu Xiuxiu의 픽셀 높이를 설정하는 방법 Mar 27, 2024 am 11:00 AM

디지털 시대에 사진은 우리의 일상생활과 업무에 없어서는 안 될 부분이 되었습니다. 소셜 미디어에 공유하든 업무 보고서에 발표하든 고품질 사진은 우리에게 많은 포인트를 더할 수 있습니다. 그러나 우리 손에 있는 사진의 픽셀이 만족스럽지 않은 경우가 많습니다. 이 경우 다양한 장면의 요구 사항에 맞게 픽셀 높이를 조정하는 몇 가지 도구가 필요합니다. 따라서 이 튜토리얼 가이드에서는 Meitu Xiuxiu를 사용하여 사진의 픽셀을 조정하는 방법을 자세히 소개합니다. 도움이 되기를 바랍니다. 먼저 휴대폰에서 [Meitu Xiu Xiu] 아이콘을 찾아 클릭하여 메인 인터페이스로 들어간 후 [사진 꾸미기] 항목을 클릭하세요. 2. 두 번째 단계는 그림과 같이 [카메라 롤] 페이지로 이동합니다. 자신을 클릭하세요.

캔버스 화살표 플러그인이란 무엇입니까? 캔버스 화살표 플러그인이란 무엇입니까? Aug 21, 2023 pm 02:14 PM

캔버스 화살표 플러그인에는 다음이 포함됩니다. 1. 간단하고 사용하기 쉬운 API가 있으며 사용자 정의 화살표 효과를 만들 수 있는 Fabric.js 2. 화살표 그리기 기능을 제공하고 다양한 화살표를 만들 수 있는 Konva.js 스타일 3. 풍부한 그래픽 처리 기능을 제공하고 다양한 화살표 효과를 얻을 수 있는 Pixi.js 4. 화살표 스타일과 애니메이션을 쉽게 생성하고 제어할 수 있는 Two.js 5. 다양한 화살표 효과를 생성할 수 있는 Arrow.js 6. 대략적인 .js, 손으로 그린 ​​화살표 등을 만들 수 있습니다.

html2canvas에는 어떤 버전이 있나요? html2canvas에는 어떤 버전이 있나요? Aug 22, 2023 pm 05:58 PM

html2canvas 버전에는 html2canvas v0.x, html2canvas v1.x 등이 포함됩니다. 자세한 소개: 1. html2canvas v0.x는 html2canvas의 초기 버전입니다. 최신 안정 버전은 v0.5.0-alpha1입니다. 2. html2canvas v1.x는 html2canvas의 새 버전입니다.

캔버스 시계의 세부 사항은 무엇입니까? 캔버스 시계의 세부 사항은 무엇입니까? Aug 21, 2023 pm 05:07 PM

캔버스 시계의 세부 사항에는 시계 모양, 눈금 표시, 디지털 시계, 시, 분 및 초침, 중심점, 애니메이션 효과, 기타 스타일 등이 포함됩니다. 자세한 소개: 1. 시계 모양, 캔버스를 사용하여 시계 모양으로 원형 다이얼을 그릴 수 있으며 다이얼의 크기, 색상, 테두리 및 기타 스타일을 설정할 수 있습니다. 2. 눈금선, 눈금선을 그립니다. 3. 디지털 시계, 다이얼에 디지털 시계를 그려서 현재 시간과 분을 표시할 수 있습니다. 4. 시침, 분침, 초침 등.

tkinter 캔버스에는 어떤 속성이 있습니까? tkinter 캔버스에는 어떤 속성이 있습니까? Aug 21, 2023 pm 05:46 PM

tkinter 캔버스 속성에는 bg, bd, 릴리프, 너비, 높이, 커서, 강조 배경, 강조 색상, 강조 두께, 삽입 배경, 삽입 너비, 선택 배경, 선택 전경, xscrollcommand 속성 등이 포함됩니다. 자세한 소개

uniapp은 캔버스를 사용하여 차트와 애니메이션 효과를 그리는 방법을 구현합니다. uniapp은 캔버스를 사용하여 차트와 애니메이션 효과를 그리는 방법을 구현합니다. Oct 18, 2023 am 10:42 AM

uniapp에서 캔버스를 사용하여 차트와 애니메이션 효과를 그리는 방법에는 특정 코드 예제가 필요합니다. 1. 소개 모바일 장치의 인기로 인해 점점 더 많은 응용 프로그램이 모바일 단말기에 다양한 차트와 애니메이션 효과를 표시해야 합니다. Vue.js를 기반으로 하는 크로스 플랫폼 개발 프레임워크인 uniapp은 캔버스를 사용하여 차트와 애니메이션 효과를 그리는 기능을 제공합니다. 이 기사에서는 uniapp이 캔버스를 사용하여 차트 및 애니메이션 효과를 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 2. 캔버스

See all articles