Próbuję narysować obraz 300dpi do obiektu canvas, ale w Chrome jest on wyświetlany w bardzo złej jakości. Kiedy użyłem poniższego kodu, to się nie poprawiło, ale to dlatego, że devicePixelRatio
było takie samo jak backingStoreRatio
(oba były 1
).Jak narysować w Chrome wysoką rozdzielczość na płótnie? I dlaczego, jeśli devicePixelRatio === webkitBackingStorePixelRatio skaluje się, aby 2x poprawić rozdzielczość?
Potem próbował wymusić pewne zmiany przełożenia i stwierdził, co następuje:
- gdybym zmienił
ratio
być2
i zmusił kod skalowania do uruchomienia, a następnie rysuje na płótnie w lepszej rozdzielczości. - Gdybym zmienił
ratio
do niczego większy niż2
(np3
,4
,5
,6
, etc), a następnie miał słabą rozdzielczość!
Wszystko to zostało wykonane na komputerze stacjonarnym.
Jak zapewnić wydruk na płótnie o wysokiej rozdzielczości?
(Kod z: http://www.html5rocks.com/en/tutorials/canvas/hidpi/)
/**
* Writes an image into a canvas taking into
* account the backing store pixel ratio and
* the device pixel ratio.
*
* @author Paul Lewis
* @param {Object} opts The params for drawing an image to the canvas
*/
function drawImage(opts) {
if(!opts.canvas) {
throw("A canvas is required");
}
if(!opts.image) {
throw("Image is required");
}
// get the canvas and context
var canvas = opts.canvas,
context = canvas.getContext('2d'),
image = opts.image,
// now default all the dimension info
srcx = opts.srcx || 0,
srcy = opts.srcy || 0,
srcw = opts.srcw || image.naturalWidth,
srch = opts.srch || image.naturalHeight,
desx = opts.desx || srcx,
desy = opts.desy || srcy,
desw = opts.desw || srcw,
desh = opts.desh || srch,
auto = opts.auto,
// finally query the various pixel ratios
devicePixelRatio = window.devicePixelRatio || 1,
backingStoreRatio = context.webkitBackingStorePixelRatio ||
context.mozBackingStorePixelRatio ||
context.msBackingStorePixelRatio ||
context.oBackingStorePixelRatio ||
context.backingStorePixelRatio || 1,
ratio = devicePixelRatio/backingStoreRatio;
// ensure we have a value set for auto.
// If auto is set to false then we
// will simply not upscale the canvas
// and the default behaviour will be maintained
if (typeof auto === 'undefined') {
auto = true;
}
// upscale the canvas if the two ratios don't match
if (auto && devicePixelRatio !== backingStoreRatio) {
var oldWidth = canvas.width;
var oldHeight = canvas.height;
canvas.width = oldWidth * ratio;
canvas.height = oldHeight * ratio;
canvas.style.width = oldWidth + 'px';
canvas.style.height = oldHeight + 'px';
// now scale the context to counter
// the fact that we've manually scaled
// our canvas element
context.scale(ratio, ratio);
}
context.drawImage(pic, srcx, srcy, srcw, srch, desx, desy, desw, desh);
}
Making wyniki tylko poniższe zmiany w obrazach na płótnie wysokiej rozdzielczości (dlaczego?):
//WE FORCE RATIO TO BE 2
ratio = 2;
//WE FORCE IT TO UPSCALE (event though they're equal)
if (auto && devicePixelRatio === backingStoreRatio) {
przypadku zmiany powyższych być stosunek 3
, to już nie jest wysoka rozdzielczość!
EDIT: Jedna dodatkowa obserwacja - nawet ze stosunkiem 2x, gdy jest zauważalnie lepsza rozdzielczość, to jeszcze nie tak ostre jak pokazano obraz w tagu img
)
Zobacz to: http://stackoverflow.com/a/15666143/3655 – Aardvark
@Aardvark Jak wspomina w moim poście , Próbowałem już kodu z tego artykułu (HTML5Rocks), który jest tym, co ten wpis odwołuje, i to nie działa, ponieważ zawsze pokazuje stosunek jako '1', który nic nie robi. –
Czy pomieszałeś z imageSmoothingEnabled? – Aardvark