2011-06-01 14 views
10

घूर्णन के बिना कोण पर कैनवास में चित्र खींचना मैं जावास्क्रिप्ट में कैनवास का उपयोग कर एचटीएमएल 5 में एक छवि खींच रहा हूं। मुझे इसे घूर्णन कोण पर खींचने की ज़रूरत है। मुझे पता है कि कैनवास के संदर्भ का उपयोग करके घूर्णन (कोण) फ़ंक्शन को लागू करके किया जा सकता है। लेकिन मुझे कैनवास को घुमाए बिना करने की आवश्यकता है।कैनवास

यदि संभव हो तो कृपया इसके लिए संभावित दृष्टिकोण का सुझाव दें।

उत्तर

6

आप वास्तव में जो भी आप ऑफस्क्रीन कैनवास में घूमना चाहते हैं उसे आकर्षित कर सकते हैं और इसे अपने मुख्य कैनवास में खींच सकते हैं। मैं एक गूगल आईओ टॉक से इस कोड को उधार:

rotobj = rotateAndCache(myimg,myangle) 

और अपने drawcode में:

rotateAndCache = function(image,angle) { 
    var offscreenCanvas = document.createElement('canvas'); 
    var offscreenCtx = offscreenCanvas.getContext('2d'); 

    var size = Math.max(image.width, image.height); 
    offscreenCanvas.width = size; 
    offscreenCanvas.height = size; 

    offscreenCtx.translate(size/2, size/2); 
    offscreenCtx.rotate(angle + Math.PI/2); 
    offscreenCtx.drawImage(image, -(image.width/2), -(image.height/2)); 

    return offscreenCanvas; 
} 

तो साथ यह कैश

mycontext.drawImage(rotobj,x_coord,y_coord) 

यह केवल उपयोगी है जब आप एक वस्तु है जो केवल एक बार कोण से घुमाया जाता है और बाद में केवल परिवर्तनों के अधीन होता है।

+0

धन्यवाद पीटर टी। यह उस बिल को लगभग फिट करता है जिसे मैं ढूंढ रहा था। एक बार फिर धन्यवाद। – Vinayak

+0

क्या आपके पास उस बात का लिंक है? – Alexander

+1

@Alexander वास्तव में मैं करता हूं: http://www.google.com/events/io/2011/sessions/super-browser-2-turbo-hd-remix-introduction-to-html5-game-development.html वीडियो http://www.youtube.com/watch?v=yEocRtn_j9s – PeterT

0

यह संभव नहीं है और आपको शायद इसकी आवश्यकता नहीं है। इसे आजमाएं:

context.save() // Save current state (includes transformations) 
context.rotate() 
... draw image ... 
context.restore() // Restore state 
+0

वहाँ एक समान तरीके से छवि को मापना है? – Kantesh

3

जब आप कैनवास पर परिवर्तन लागू करते हैं तो आप कैनवास को घुमाते नहीं हैं। आप बस इतना बताओ कि आप सभी को आकर्षित करने के लिए विशेष रूप से बदल दिया जाएगा। यदि आप अन्य आदेशों को प्रभावित करने के लिए परिवर्तन से बचना चाहते हैं तो save() और restore() विधियों का उपयोग करें। वे कैनवास की सेटिंग्स को सहेजने और पुनर्स्थापित करने की अनुमति देते हैं।

ctx.save(); 
ctx.rotate(30); 
ctx.drawImage(); 
ctx.restore(); 
+0

क्या छवि को स्केल करने का कोई ही तरीका है? – Kantesh

+0

हां, 'घुमाने' के बजाय 'स्केल'। और दो पैरामीटर, क्षैतिज और ऊर्ध्वाधर स्केलिंग कारक। – bjornd

1

मैंने @ पीटर टी - महान स्निपेट को ऊपर उठाया है और अच्छी तरह से काम करता है - इसके लिए धन्यवाद! मुझे यह मेरे लिए काम करने के लिए 3 छोटे बदलाव करना पड़ता था:

1. चौड़ाई और ऊंचाई का अधिकतम पर्याप्त नहीं है: यदि आप एक वर्ग को घूर्णन करने के बारे में सोचते हैं, तो आपको एक सर्कल की आवश्यकता होती है जिसका व्यास विकर्ण है वर्ग के (var diam)।
2. कैनवास को वापस अनुवादित करने की आवश्यकता है (या सहेजें/पुनर्स्थापित करें)।
3. ऑब्जेक्ट एक्स और वाई निर्देशांक को कैनवास आकार के लिए समायोजित किया जाना है।

तो मैं के साथ समाप्त हो गया:

rotateAndCache = function(image,angle) { 
     var offscreenCanvas = document.createElement('canvas'); 
     var offscreenCtx = offscreenCanvas.getContext('2d'); 

     var size = Math.max(image.width, image.height); 
     var diam = 2*((size/2)*Math.sqrt(2));     // needs to be saved 
     offscreenCanvas.width = diam; 
     offscreenCanvas.height = diam; 

     offscreenCtx.translate(diam/2, diam/2); 
     offscreenCtx.rotate(angle); 
     offscreenCtx.drawImage(image, -(image.width/2), -(image.height/2)); 
     offscreenCtx.translate(-diam/2, -diam/2); 

     return offscreenCanvas; 
} 


और समायोजित ड्रा स्थिति (बचाया जा करने की जरूरत है rotateAndCache में):
mycontext.drawImage(rotobj,x-(diam-width)/2,y-(diam-height)/2);

+0

यदि आप सटीक होना चाहते हैं तो आपको एक व्यास के साथ एक सर्कल की आवश्यकता है जो आयताकार के विकर्ण के बराबर है, इसलिए यह 'var diam = Math.sqrt (image.width * image.width + image.height * छवि होगी .height); 'लेकिन हाँ, मुझे तुम्हारा मुद्दा मिलता है। – PeterT

+0

हाँ, सबसे बड़ा आयाम उलझन में है, मेरा मतलब विकर्ण है। कोड को यह करना चाहिए (यह 1-1-रेडिकल 2 दायां त्रिकोण है) – dhc

+0

लेकिन यह सभी तरफ 'अधिकतम (image.width, image.height)' की लंबाई वाले वर्ग का विकर्ण है, है ना? जो असमान साइड-लम्बाई वाले आयत में से एक से थोड़ा बड़ा हो सकता है या नहीं (कम से कम यह छोटा नहीं है, इसलिए यह त्रुटियों का कारण नहीं बनता है)। – PeterT