2010-09-25 12 views
25

पर मैं <canvas> में एनीमेशन के साथ प्रयोग कर रहा हूं और कोण पर एक छवि को आकर्षित करने के तरीके से बाहर काम नहीं कर सकता। वांछित प्रभाव सामान्य रूप से खींची गई कुछ छवियां होती हैं, जिसमें एक छवि धीरे-धीरे घूमती है। (यह छवि स्क्रीन के केंद्र में नहीं है, अगर इससे कोई फर्क पड़ता है)।एचटीएमएल 5 कैनवास ड्रा इमेज

उत्तर

53

आपको उस छवि को चित्रित करने से पहले रूपांतरण मैट्रिक्स को संशोधित करने की आवश्यकता है जिसे आप घुमाएंगे।

HTMLImageElement ऑब्जेक्ट पर छवि बिंदु मानें।

var x = canvas.width/2; 
var y = canvas.height/2; 
var width = image.width; 
var height = image.height; 

context.translate(x, y); 
context.rotate(angleInRadians); 
context.drawImage(image, -width/2, -height/2, width, height); 
context.rotate(-angleInRadians); 
context.translate(-x, -y); 

एक्स, वाई निर्देशांक कैनवास पर छवि का केंद्र है।

+4

अंत में घूर्णन/अनुवाद करने के बजाय, आप परिवर्तन और ड्राइंग करने से पहले और बाद में 'context.save() 'और' context.restore() 'कर सकते हैं। –

+24

सहेजने()/पुनर्स्थापन() का उपयोग करते समय क्लीनर प्रतीत हो सकता है, यह अधिक अक्षम होगा। इंजन को सभी संदर्भ गुणों को स्टोर/पुनर्स्थापित करना होगा, न केवल उन लोगों को जिन्हें हम यहां जोड़ रहे हैं। यह एक संवेदनशील कोड पथ में मायने रखता है। –

+0

एक और उदाहरण के लिए, यह (डुप्लिकेट) प्रश्न और उत्तर देखें: [एचटीएमएल 5 कैनवास का उपयोग करके गेज का डायल करें - घुमावदार बिंदु के बारे में घुमाएं] (http://stackoverflow.com/questions/4649836/dial-of-a-gauge-using -html5-कैनवास घुमाने-के बारे में मनमाना सूत्री/4,650,102 # 4,650,102)। – Phrogz

8

मैं एक समारोह (जेकब के जवाब के आधार पर) है कि उपयोगकर्ता एक एक्स में एक छवि पेंट करने के लिए अनुमति देता है लिखा है, एक कस्टम रोटेशन बिंदु में एक कस्टम रोटेशन के आधार पर Y स्थिति:

function rotateAndPaintImage (context, image, angleInRad , positionX, positionY, axisX, axisY) { 
    context.translate(positionX, positionY); 
    context.rotate(angleInRad); 
    context.drawImage(image, -axisX, -axisY); 
    context.rotate(-angleInRad); 
    context.translate(-positionX, -positionY); 
} 

तो फिर तुम फोन कर सकते हैं यह इस तरह है:

var TO_RADIANS = Math.PI/180; 
ctx = document.getElementById("canvasDiv").getContext("2d"); 
var imgSprite = new Image(); 
imgSprite.src = "img/sprite.png"; 

// rotate 45º image "imgSprite", based on its rotation axis located at x=20,y=30 and draw it on context "ctx" of the canvas on coordinates x=200,y=100 
rotateAndPaintImage (ctx, imgSprite, 45*TO_RADIANS, 200, 100, 20, 30); 
2

यह दिलचस्प है कि पहले समाधान ने इतने सारे लोगों के लिए काम किया, यह मुझे आवश्यक परिणाम नहीं दिया। अंत मैं यह करने के लिए किया था में:

ctx.save(); 
ctx.translate(positionX, positionY); 
ctx.rotate(angle); 
ctx.translate(-x,-y); 
ctx.drawImage(image,0,0); 
ctx.restore(); 

जहां (positionX, positionY) कैनवास मैं चाहता हूँ कि छवि पर स्थित होना करने के लिए और (x, y) छवि जहां मैं छवि घुमाना चाहते पर है पर निर्देशांक है।

संबंधित मुद्दे