J'ai un problème avec la méthode drawImage() de contexte de canevas si une image est dessinée sur un canevas qui a déjà un facteur d'échelle non-entier. Il semble que de telles images sont découpées de façon étrange (parfois, la partie la plus droite d'une image est coupée, parfois la partie la plus basse, parfois les deux). Ce problème apparaît au moins dans Google Chrome 6 (au moins stable), Chromium 6, peut-être même les dernières versions (dev-), et même Safari 5. Firefox n'a pas ce bug. Évidemment, c'est un problème de Webkit si je ne me trompe pas. Regardons le code suivant (fourni code entier pour une démonstration):Webkit canvas drawImage() et le canevas d'un facteur d'échelle not-integer de canevas?
<html>
<head>
<style type="text/css">
canvas {
border: solid 1px black;
}
</style>
<script type="text/javascript">
window.onload = function() {
var canvas = document.getElementById("canvas");
var increase = document.getElementById("increase");
var decrease = document.getElementById("decrease");
var scale = document.getElementById("scale");
var context = canvas.getContext("2d");
var image = new Image();
image.src = "image-3x5.png";
var scaleX = 1;
var scaleY = 1;
var repaint = function() {
scale.innerHTML = scaleX + "; " + scaleY;
context.fillStyle = "#FFF";
context.fillRect(0, 0, 1000, 750);
context.drawImage(image, 0, 0, 3, 5);
};
var scaleXF = 1.2; // change both to 2 and it will be fixed
var scaleYF = 1.2;
decrease.onclick = function() {
scaleX /= scaleXF;
scaleY /= scaleYF;
context.scale(1/scaleXF, 1/scaleYF);
repaint();
};
increase.onclick = function() {
scaleX *= scaleXF;
scaleY *= scaleYF;
context.scale(scaleXF, scaleYF);
repaint();
};
repaint();
};
</script>
</head>
<body>
<div>
<span id="scale"></span>
</div>
<div>
<canvas id="canvas" width="1000" height="750"></canvas>
</div>
<div>
<input id="decrease" type="button" value="decrease" />
<input id="increase" type="button" value="increase" />
</div>
</body>
</html>
est-il donc un vrai bug? Ou y a-t-il des solutions de contournement?
Merci d'avance.
UPD:
considérons que nous avons l'image de 3x5 base64 suivant:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAEklEQVR42mP4z8DwH4YZyOAAAMufHeNmMS0JAAAAAElFTkSuQmCC
pouvez-vous nous donner l'image en tant que données: image/png; base64 ,? –
@Simon Sarris: Je ne sais pas si c'est un base64 bien formé, parce que je suis en retard et très pressé en ce moment. J'espère que je ne me trompe pas. Voir la mise à jour s'il vous plaît. –
Je reproduis bien le problème que vous voyez (avec ma propre image aussi) –