2016-03-14 98 views
1

我想使用createjs動態縮小畫布上的某些圖像,然後存儲較小的圖像以在出於性能原因放大畫布時顯示。現在,我使用下面的代碼:使用createjs/easeljs調整圖像大小

var bitmap = createjs.Bitmap('somefile.png'); 
// wait for bitmap to load (using preload.js etc.) 

var oc = document.createElement('canvas'); 
var octx = oc.getContext('2d'); 
oc.width = bitmap.image.width*0.5; 
oc.height = bitmap.image.height*0.5; 
octx.drawImage(bitmap.image, 0, 0, oc.width, oc.height); 

var dataUrl = oc.toDataURL('image/png'); // very expensive 
var smallBitmap = new createjs.Bitmap(dataUrl); 

這工作,但:轉換爲image/png時,並在實踐中使用過慢

  1. toDataURL操作是非常昂貴的(和我由於我嘗試過的所有設置的輸出質量不佳,因此無法轉換爲更快的image/jpeg

  2. 當然,必須有一種方法來縮小圖像大小,而不必訴諸單獨的畫布代碼,然後手動進行轉換以繪製到createjs Bitmap對象上?

我也試過:

octx.drawImage(bitmap.image, 0, 0, oc.width, oc.height); 
var smallBitmap = new createjs.Bitmap(oc); 

但是,雖然非常快,這似乎並沒有實際工作(且在任何情況下,我不必每次都創建一個單獨的canvas元素)

我想知道是否有方法可以使用drawImage直接將縮減採樣版本的位圖繪製到createjs位圖實例中,而無需通過單獨的畫布對象或進行轉換字符串?

如果我理解正確,內部這是如何createjs cache屬性工作(即使用drawImage內部寫入DisplayObject),但我無法弄清楚如何使用它自己。

+1

等等,爲什麼?爲什麼不使用['contex.drawImage(0,0,desiredwidth,desiredheight)'](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/drawImage),然後使用['canvas.toDataURL( )'](https://developer.mozilla.org/docs/Web/API/HTMLCanvasElement/toDataURL)來獲取調整大小的圖像?這是canvas自己的API已經可以做到的事情。 –

+0

糾正我,如果我錯了,但這就是我上面基本上做的?我不確定你所指的上下文來自哪裏,但這就是'octx'的含義。另外,如前所述,我試圖避免對'canvas.toDataURL()'進行非常昂貴的調用。也很高興使用本地畫布例程,但需要一些方法將結果圖像包裝到createjs Bitmap對象中(因爲我使用createjs來管理其他所有內容)。 –

+1

雖然我不明白「太慢」的部分,但實際上你做了什麼*這要求你經常運行它,以至於它的性能是一個問題? –

回答

2

您已使用createjseaseljs標記此帖子,但您的示例顯示了用於縮放的普通Canvas上下文用法。

您可以使用Bitmap.cache()上的scale參數來獲得所需結果,然後根據需要重新使用cacheCanvas

// This will create a half-size cache (50%) 
// But scale it back up for you when it displays on the stage 
var bmp = new createjs.Bitmap(img); 
bmp.cache(0, 0, img.width, img.height, 0.5); 

// Pull out the generated cache and use it in a new Bitmap 
// This will display at the new scaled size. 
var bmp2 = new createjs.Bitmap(bmp.cacheCanvas); 

// Un-cache the first one to reset it if you want 
bmp.uncache(); 

這裏是一個小提琴看到它在行動:http://jsfiddle.net/lannymcnie/ofdsyn7g/

注意緩存只是用另一種帆布帶的drawImage規模下來。我絕對會遠離toDataURL,因爲它根本就不表現。

+0

這真是太棒了!這麼多的幫助!不知道如何直接使用createjs來調整大小,從而獲得簡單的canvas上下文使用情況,但現在我不需要直接顯示如何使用createjs。有一種感覺,我可能能夠以某種方式使用緩存,但從文檔中不太清楚。 –

+0

緩存爲「0.5」分辨率後,不會將'bmp'的'scaleX'和'scaleY'屬性都設置爲'0.5',而不是從緩存畫布中創建新的位圖? –

+0

好點蒂亞戈!儘管您必須放棄縮小的緩存圖像以恢復原始的全尺寸圖像。另外,可以想象縮小圖像比創建新的位圖要昂貴得多。 –