<canvas> 크기 조정시 보간 비활성화


126

참고 :이 방법과 관련이있다 최대 크기를 조절할 때 기존의 캔버스 요소를 렌더링 , 하지 선이나 그래픽 렌더링 방법을 함께 할 캔버스 표면에 . 즉, 이것은 크기 조정 된 요소의 보간 과 관련이있으며 캔버스에 그려지는 그래픽의 앤티 앨리어싱 과는 아무 관련이 없습니다. 나는 브라우저가 어떻게 선을 그리는지 신경 쓰지 않는다. 크기가 커질 때브라우저가 캔버스 요소 자체를 렌더링하는 방법에 관심이 있습니다.


<canvas>요소 크기를 조정할 때 보간을 비활성화하기 위해 프로그래밍 방식으로 변경할 수있는 캔버스 속성 또는 브라우저 설정이 있습니까? 크로스 브라우저 솔루션이 이상적이지만 필수적인 것은 아닙니다. Webkit 기반 브라우저는 나의 주요 목표입니다. 성능은 매우 중요합니다.

이 질문 은 가장 유사하지만 문제를 충분히 설명하지는 않습니다. 그만한 가치가 있기 때문에 나는 image-rendering: -webkit-optimize-contrast아무 소용이 없었습니다.

이 응용 프로그램은 내가 필요한 것을 명확히하기 위해 HTML5 + JS로 작성된 "복고풍"8 비트 스타일 게임이 될 것입니다.


예를 들면 다음과 같습니다. ( 라이브 버전 )

21x21 캔버스가 있다고 가정합니다.

<canvas id='b' width='21' height='21'></canvas>

... 요소를 5 배 더 크게 만드는 CSS가 있습니다 (105x105).

canvas { border: 5px solid #ddd; }
canvas#b { width: 105px; height: 105px; } /* 5 * 21 = 105 */

캔버스에 다음과 같이 간단한 'X'를 그립니다.

$('canvas').each(function () {
    var ctx = this.getContext("2d");
    ctx.moveTo(0,0);
    ctx.lineTo(21,21);
    ctx.moveTo(0,21);
    ctx.lineTo(21,0);
    ctx.stroke();
});

왼쪽 이미지는 Chromium (14.0)이 렌더링하는 것입니다. 오른쪽 이미지는 내가 원하는 것입니다 (설명을 위해 손으로 그린 ​​것).

Chrome은 크기가 조정 된 캔버스 요소를 보간합니다. 보간되지 않은 버전



1
나는 그 질문이 앤티 앨리어스 선을 그리는 선 그리기 기능을 언급하고 있다고 생각합니다. 크기가 조정 된 캔버스 요소가 기본적으로 보간으로 렌더링되는 방식을 언급하고 있습니다.
namuol

네, 미안 해요 ... 처음에 같은 질문을 생각하고는 즉시 제 실수를 알아 차 렸습니다. :-/ jsmanipulate의 픽셀 화 필터를 사용 해보면 어떨까요? joelb.me/jsmanipulate
HostileFork은 그나마 신뢰 SE 말한다

1
그것은 사진을위한 이미지 필터에 가깝습니다.
namuol 2011 년

예,하지만 왼쪽 이미지를 오른쪽 이미지의 좋은 버전으로 변환하여 행복하게 만들면 브라우저 간 솔루션을 제공 할 수 있습니다 (이 그리기 모드에 대한 플래그를 찾기에 너무 유망하지 않다는 점을 고려하면 범용 또는 기타) , WebKit에서). 실행 가능한 대체물인지 여부는 해결하려는 문제에 따라 달라집니다. 불연속적인 픽셀 드로잉이 정말로 필요한지 아니면 결과가 특정 세분화로 픽셀 화되는지 확인하려는 경우입니다.
HostileFork는 SE를 신뢰하지 않는다고 말합니다.

답변:


126

최종 업데이트 : 2014 년 9 월 12 일

요소 크기를 조정할 때 보간을 비활성화하기 위해 프로그래밍 방식으로 변경할 수있는 캔버스 속성 또는 브라우저 설정이 있습니까?

대답은 아마도 언젠가입니다 . 지금은 원하는 것을 얻기 위해 해킹에 의존해야합니다.


image-rendering

CSS3의 작업 초안은image-rendering 내가 원하는 작업을 수행해야하는 새 속성을 설명합니다 .

이미지 렌더링 속성은 사용자 에이전트가 적절한 크기 조정 알고리즘을 선택하는 데 도움이되도록 이미지 크기를 조정할 때 보존해야하는 이미지 측면에 대한 힌트를 사용자 에이전트에 제공합니다.

사양은 세 가지 허용 값을 설명합니다 : auto, crisp-edges,와 pixelated.

픽셀 화 :

이미지를 확대 할 때 "가장 가까운 이웃"또는 유사한 알고리즘을 사용하여 이미지가 단순히 매우 큰 픽셀로 구성된 것처럼 보이도록해야합니다. 축소 할 때 자동과 동일합니다.

표준? 크로스 브라우저?

이것은 단지 작업 초안 이기 때문에 표준이 될 것이라는 보장은 없습니다. 브라우저 지원은 현재 기껏해야 불안정합니다.

Mozilla 개발자 네트워크에는 최신 기술에 대한 매우 철저한 페이지가 있습니다. 내가 읽을 것을 강력히 추천 .

Webkit 개발자는 처음에 이것을 임시로 구현하기로 선택했습니다.-webkit-optimize-contrast 했지만 Chromium / Chrome은이를 구현하는 Webkit 버전을 사용하지 않는 것 같습니다.

업데이트 : 2014-09-12

Chrome 38은 이제 image-rendering: pixelated !

Firefox는 구현할 버그 보고서가 열려 image-rendering: pixelated있지만 -moz-crisp-edges지금은 작동합니다.

해결책?

지금까지 가장 크로스 플랫폼, CSS 전용 솔루션은 다음과 같습니다.

canvas {
  image-rendering: optimizeSpeed;             /* Older versions of FF          */
  image-rendering: -moz-crisp-edges;          /* FF 6.0+                       */
  image-rendering: -webkit-optimize-contrast; /* Safari                        */
  image-rendering: -o-crisp-edges;            /* OS X & Windows Opera (12.02+) */
  image-rendering: pixelated;                 /* Awesome future-browsers       */
  -ms-interpolation-mode: nearest-neighbor;   /* IE                            */
}

안타깝게도 아직 모든 주요 HTML5 플랫폼 (특히 Chrome)에서는 작동하지 않습니다.

물론, 자바 스크립트의 고해상도 캔버스 표면에 가장 가까운 이웃 보간을 사용하여 이미지를 수동으로 확장하거나 서버 측 이미지 크기를 사전 조정할 수 있지만 제 경우에는 비용이 많이 들기 때문에 실행 가능한 옵션이 아닙니다.

ImpactJS 는이 모든 FUD를 처리하기 위해 텍스처 사전 크기 조정 기술을 사용합니다. Impact의 개발자 인 Dominic Szablewski 는 이에 대해 매우 심층적 인 기사를 작성했습니다 (그는 연구에서이 질문을 인용하기도했습니다).

에 의존하는 캔버스 기반 솔루션에 대한 Simon의 답변 을 참조하십시오 .imageSmoothingEnabled속성에 (이전 브라우저에서는 사용할 수 없지만 사전 크기 조정보다 간단하고 널리 지원됨).

라이브 데모

canvas요소 에 대한 MDN 기사에서 논의 된 CSS 속성을 테스트하려면 브라우저에 따라 다음과 같이 흐릿하게 표시되거나 표시되지 않는 이 바이올린 을 만들었습니다 . 아이소 메트릭 픽셀 아트 스타일 TV의 4 : 1 (64x64 ~ 256x256) 이미지


이미지 렌더링은 다른 곳에서 작동하는 것처럼 보이지만 웹킷 브라우저입니다. Chrome / Chromium / Safari 직원이 "저 부하 상황에서 EPX 보간으로 전환"이 의미하는 바를 잘 읽어 주셨으면합니다. 문장을 처음 읽었을 때 최적화-대비는 낮은 부하에서 새로운 색상을 생성 할 수 있다고 생각했지만 아니요 : en.wikipedia.org/wiki/…
Timo Kähkönen

2
Mac 및 Windows의 Opera 12.02는 image-rendering : -o-crisp-edges ( jsfiddle.net/VAXrL/21 )를 지원하므로 답변에 추가 할 수 있습니다.
Timo Kähkönen 2012 년

브라우저 확대 / 축소를 늘릴 때 작동해야합니까? 브라우저 확대 / 축소가 150 %이고 모든 브라우저에서 결과가 흐릿한 경우 Windows 7에서 FF 22, Chrome 27 및 IE 10으로 그리기를 테스트했습니다. 캔버스 너비와 높이를 두 배로 늘리고 CSS를 사용하여 원래 너비와 높이로 다시 설정하면 날카로운 선이 그려집니다.
pablo

그건 좋은 질문이야. 사용자 지정 확장 동작에 대한 사양이 있는지 확실하지 않습니다.
namuol

1
저는 (현재 미래부터!) Chrome 78을 사용하고 있습니다. "이미지 렌더링 : 픽셀 화됨"이 표시됩니다. 일. 이것이 크롬 (41)에 2015 년에 추가 된 다음과 같습니다 developers.google.com/web/updates/2015/01/pixelated
MrColes

61

새 답변 2012-07-31

드디어 캔버스 사양입니다!

사양은 최근에라는 속성을 추가했습니다. imageSmoothingEnabled기본값은 true정수가 아닌 좌표에 그려 지거나 배율이 그려져있는 이미지가 더 부드러운 알고리즘을 사용할지 여부를 결정합니다. 설정된 경우false 가장 가까운 이웃이 사용되어 덜 부드러운 이미지를 생성하고 대신 더 크게 보이는 픽셀을 만듭니다.

이미지 평활화는 최근에야 캔버스 사양에 추가되었으며 모든 브라우저에서 지원되지는 않지만 일부 브라우저에서는이 속성의 공급 업체 접두사 버전을 구현했습니다. 컨텍스트 상 mozImageSmoothingEnabledFirefox와 webkitImageSmoothingEnabledChrome 및 Safari에 존재 하며 이를 false로 설정하면 앤티 앨리어싱이 발생하지 않습니다. 불행히도 작성 당시 IE9 및 Opera는이 속성, 공급 업체 접두사 등을 구현하지 않았습니다.


미리보기 : JSFiddle

결과:

여기에 이미지 설명 입력


1
불행히도 이것은 아직 작동하지 않는 것 같습니다. 내가 뭔가를 놓친 것일까 요? 여기에 테스트가 있습니다 : jsfiddle.net/VAXrL/187
namuol

12
작동하려면 캔버스 API를 사용하여 크기를 조정해야합니다. CSS로 크기를 조정할 수 없으며 캔버스 API가 영향을 미치게됩니다! 이 같은 그래서 : jsfiddle.net/VAXrL/190
사이먼 Sarris

1
그러나이 문제의 본질은 캔버스에 관한 것이 아닙니다. 브라우저가 <canvas> 요소를 포함하여 확장 된 이미지를 렌더링하는 방법에 관한 것입니다.
namuol

4
CSS를 사용하여 확장하면 namuol의 솔루션이 작동합니다. 캔버스에 이미지를 수동으로 크기를 조정하면 Simon의 솔루션이 작동합니다. 두 경우 모두에 대한 솔루션이 있다는 것이 깔끔하므로 둘 다 감사합니다!
Shaun Lebron 2012 년

IE 11의 경우 : msImageSmoothingEnabled가 저에게 적합합니다! msdn.microsoft.com/en-us/library/dn265062(v=vs.85).aspx
스티브

11

2012 년 7 월 31 일 수정-이 기능은 이제 캔버스 사양에 포함됩니다! 여기에서 별도의 답변을 참조하십시오.

https://stackoverflow.com/a/11751817/154112

후손을위한 오래된 대답은 다음과 같습니다.


원하는 효과에 따라 다음과 같은 옵션이 있습니다.

var can = document.getElementById('b');
var ctx = can.getContext('2d');
ctx.scale(5,5);
$('canvas').each(function () {
    var ctx = this.getContext("2d");
    ctx.moveTo(0,0);
    ctx.lineTo(21,21);
    ctx.moveTo(0,21);
    ctx.lineTo(21,0);
    ctx.stroke();
});

http://jsfiddle.net/wa95p/

다음을 생성합니다.

여기에 이미지 설명 입력

아마도 당신이 원하는 것이 아닐 것입니다. 그러나 만약 당신이 단지 제로 블러를 찾고 있다면 그것이 티켓이 될 것이므로 혹시라도 그것을 제공 할 것입니다.

더 어려운 옵션은 픽셀 조작을 사용하고 작업에 대한 알고리즘을 직접 작성하는 것입니다. 첫 번째 이미지의 각 픽셀은 새 이미지에서 5x5 픽셀 블록이됩니다. 이미지 데이터를 사용하는 것은 그리 어렵지 않습니다.

그러나 Canvas와 CSS만으로는 원하는 정확한 효과로 하나를 다른 크기로 확장하는 데 도움이되지 않습니다.


네, 그게 제가 두려워했던 것입니다. 분명히 image-rendering: -webkit-optimize-contrast트릭을해야하지만 아무것도하지 않는 것 같습니다. 가장 가까운 이웃 보간을 사용하여 캔버스의 내용을 확장하는 함수를 롤링하는 방법을 살펴볼 수 있습니다.
namuol 2011 년

나는 원래 당신의 대답을 받아 들였습니다. 중복 여부에 대해 혼란스러워서 지금은 취소했습니다.
namuol

나는 약간의 조사를 한 후에 더 완전한 대답을 얻었으며 내 대답을 제공하기 위해 질문을 다시 열고 싶습니다.
namuol

3

Google 크롬에서는 캔버스 이미지 패턴이 보간되지 않습니다.

다음은 namuol answer http://jsfiddle.net/pGs4f/ 에서 편집 한 작업 예제입니다.

ctx.scale(4, 4);
ctx.fillStyle = ctx.createPattern(image, 'repeat');
ctx.fillRect(0, 0, 64, 64);

이것은 내가 지금까지 본 것 중 가장 매력적인 해결 방법입니다. 아직 성능에 대해서는 확실하지 않지만 살펴볼 가치가 있습니다. 시도해 볼게요.
namuol

반복하지 않는 대신 반복을 사용하는 것이 더 빠릅니다. 이유를 모릅니다. 그것은 three.js를가 CanvasRenderer이를 사용, 꽤 빨리도 있어요
saviski

6
업데이트 : 더 이상 (인해 추가 망막 디스플레이 지원?) 크롬 (21)와 함께 작동하지 않습니다 새 버전 jsfiddle.net/saviski/pGs4f/12 imageSmoothingEnabled를 사용 사이먼에 의해 지적
saviski

Retina 해상도가 일반화되면 상황이 엄청나게 바뀝니다. iPhone4-5 스타일 326dpi (128dpcm) Retina 디스플레이가 24 인치 (52x32cm) 모니터에 출시되면 화면 크기는 6656 x 4096 픽셀이됩니다. 그러면 앤티 앨리어싱이 나쁘고 모든 브라우저 공급 업체 (Webkit 기반 포함)도 앤티 앨리어싱 비활성화를 허용해야합니다. 앤티 앨리어싱은 CPU 집약적 인 작업이며 6656 x 4096 픽셀 이미지의 앤티 앨리어싱은 너무 느리지 만 다행히 이러한 디스플레이에서는 불필요합니다.
Timo Kähkönen 2010

1
참고로, 여기에 좋은 벤치 마크 aboout 패턴 대 이미지가 있습니다. jsperf.com/drawimage-vs-canvaspattern/9
yckart 2013

1

여기 에 설명 된 Saviski의 해결 방법 은 다음에서 작동하기 때문에 유망합니다.

  • Chrome 22.0.1229.79 Mac OS X 10.6.8
  • Chrome 22.0.1229.79m Windows 7
  • Chromium 18.0.1025.168 (개발자 빌드 134367 Linux) Ubuntu 11.10
  • Firefox 3.6.25 Windows 7

그러나 다음에서는 작동하지 않지만 CSS 이미지 렌더링을 사용하여 동일한 효과를 얻을 수 있습니다.

  • Firefox 15.0.1 Mac OS X 10.6.8 (이미지 렌더링 : -moz-crisp-edges는 여기에서 작동 합니다. )
  • Opera 12.02 Mac OS X 10.6.8 (이미지 렌더링 : -o-crisp-edges는 여기에서 작동 합니다. )
  • Opera 12.02 Windows 7 (이미지 렌더링 : -o-crisp-edges는 여기에서 작동 합니다. )

ctx.XXXImageSmoothingEnabled가 작동하지 않고 이미지 렌더링이 작동하지 않기 때문에 문제는 다음과 같습니다.

  • Safari 5.1.7 Mac OS X 10.6.8. (이미지 렌더링 : -webkit-optimize-contrast 작동하지 않음)
  • Safari 5.1.7 Windows 7 (이미지 렌더링 : -webkit-optimize-contrast 작동하지 않음)
  • IE 9 Windows 7 (-ms-interpolation-mode : nearest-neighbor 작동하지 않음)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.