2011-10-11 21 views
0

嘿傢伙希望有人可以幫助這裏。我裁剪的位圖圖像到使用下面的函數瓦片:AS3 - 製作一個新的非整合寬度和高度的位圖數據

function crop(_x:Number, _y:Number, _width:Number, _height:Number, callingScope:MovieClip, displayObject:DisplayObject = null, pixelSnapping:Boolean = false):Bitmap 
{ 
    var cropArea:Rectangle = new Rectangle(0, 0, _width, _height); 
    var croppedBitmap:Bitmap; 

    if(pixelSnapping == true) 
    { 
     croppedBitmap = new Bitmap(new BitmapData(_width, _height), PixelSnapping.ALWAYS, true); 
    } 
    else 
    { 
     croppedBitmap = new Bitmap(new BitmapData(_width, _height), PixelSnapping.NEVER, true); 
    } 

    croppedBitmap.bitmapData.draw((displayObject!=null) ? displayObject : callingScope.stage, new Matrix(1, 0, 0, 1, -_x, -_y) , null, null, cropArea, true); 

    return croppedBitmap; 
} 

的寬度和高度在被傳遞是一個非整數值,例如18.75。當創建新的BitmapData時,它始終將值舍入爲一個整數,因爲BitmapData的參數是這樣鍵入的。在我這裏需要的情況下,寬度和高度不可能是整數。有沒有辦法以我需要的確切寬度和高度創建另一幅圖像的這些位圖片段,或者只能使用高度和寬度的整數值創建新的bitmapData?

感謝您的任何見解。

編輯:我意識到你不能有一個像素的一小部分,但是......我試圖實現的是將圖像分成瓷磚。我想瓷磚的數量是可變的,比如說4行4列,或者6行8列。將圖像劃分爲X個部分導致寬度和高度在大多數情況下是非整數值,例如18.75。我們的目標是將圖像分成多個圖塊,然後將圖像以無縫方式出現在源圖像上方,然後在這裏爲各種目的(益智遊戲,平鋪動畫到新場景等)操縱各個圖塊。我需要圖像,當從所有的瓷磚碎片組裝而成時,是原始圖像的精確副本,瓷磚之間沒有線條,或任何地方有白色邊緣,我需要這種情況發生在非整數寬度和高度的bitmapData塊包含瓷磚。這有道理嗎? O_o

+3

的BitmapData組成像素。確切的像素數量是寬度*高度。像素是一個色點。 BitmapData不是關於可視元素的。這是關於如何將視覺元素存儲在內存中。不能有一半的信息量。請解釋你試圖達到的目標,以便我們提供更好的解決方案。 –

+0

編輯我的答案來回答你編輯的問題 – Creynders

+0

既然沒有可以分割的神奇公式,比如說5除以2而沒有餘數,那麼你將不得不進行填充,裁剪或縮放圖像,以使整數數學運算出來。當然,這不會是一個確切的副本。 –

回答

1

BitmapData只能用維的整數值創建。老實說,我試圖想想一個BitmapData對象的維數浮點數值會是什麼樣子,但是我的大腦開始在痛苦中尖叫:不會讓感覺!

有時我的大腦有點戲劇化。

- 編輯 - 回答您的問題編輯:

2個選擇:

1 /只是最初完全位圖數據複製多次,你有地磚,然後使用位圖對象口罩以顯示瓦片的適當部分

2確保切片不會產生分數寬度或高度。例如,如果您的圖像寬度爲213,您想要分成2行和2列,則將左側拼貼的寬度設置爲106,將右側拼貼的寬度設置爲107。但是這兩個人對我來說似乎是最容易獲得成功的最簡單的方式。如果你需要創建的行和電話的確切數額

private function CreateTilesBySize(bigImage:Bitmap, preferredTileWidth:int, preferredTileHeight:int):Tiles 
{ 
    var result:Tiles = new Tiles(); 
    var y:int = 0; 
    while (y < bigImage.height) { 
    result.NewRow(); 
    const tileHeight:int = Math.min(preferredTileHeight, bigImage.height - y); 
    var x:int = 0; 
    while (x < bigImage.width) { 
     const tileWidth:int = Math.min(preferredTileWidth, bigImage.width - x); 
     const tile:Bitmap = Crop(x, y, tileWidth, tileHeight, bigImage); 
     result.AddTile(tile); 
     x += tileWidth; 
    } 
    y += tileHeight; 
    } 
    return result; 
} 

0

如果你需要創建一個最佳尺寸的瓷磚,你可以使用類似的東西。然後你可以使用:

private function CreateTilesByNum(bigImage:Bitmap, cols:int, rows:int):Tiles 
{ 
    const preferredTileWidth:int = Math.ceil(bigImage.width/cols); 
    const preferredTileHeight:int = Math.ceil(bigImage.height/rows); 
    return CreateTilesBySize(bigImage, preferredTileWidth, preferredTileHeight); 
} 

但請記住,地磚將有diferent大小(在一排最後一個磚和瓷磚最後一列)

相關問題