2016-02-07 62 views
3

我正在編輯一個位圖來優化它的OCR掃描。我需要做的事情之一是將圖像旋轉270度。我正在使用以下代碼:試圖旋轉位圖沒有成功

Matrix matrix = new Matrix(); 
matrix.PostRotate (270); 
canvas.DrawBitmap(alteredBitmap, matrix, paint); 

顯然,這對我不起作用。有人能指出我錯在哪裏嗎? 位圖來自byte[]

+0

定義「不起作用」。它崩潰了嗎?它不顯示任何東西嗎?它顯示位圖,但沒有旋轉? – Jason

+0

我沒有在Xamarin上工作,但我已經在C#中旋轉了圖像。在C#中,我需要重新計算旋轉圖像的步幅,因爲如果將圖像的寬度旋轉90/270度,則會更改圖像的寬度 –

+0

@Jason不起作用=不旋轉圖像 –

回答

0

這種方法一直爲我工作

Matrix matrix = new Matrix(); 
    //myBitmap is the bitmap which is to be rotated 
    matrix.postRotate(rotateDegree); 
    Bitmap bitmap = Bitmap.createBitmap(myBitmap, 0, 0, myBitmap.getWidth(), myBitmap.getHeight(), matrix, true);//Rotated Bitmap 

那麼如果你有從URL生成該位,繼續使用此功能

public Bitmap decodeBitmap(File f) { 

    try { 
     //Decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 
     BitmapFactory.decodeStream(new FileInputStream(f), null, o); 

     //The new size we want to scale to 
     final int REQUIRED_SIZE = 490; 

     //Find the correct scale value. It should be the power of 2. 
     int scale = 1; 
     while (o.outWidth/scale/2 >= REQUIRED_SIZE && o.outHeight/scale/2 >= REQUIRED_SIZE) 
      scale *= 2; 

     //Decode with inSampleSize 
     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize = scale; 
     return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
    } catch (FileNotFoundException e) { 
    } 
    return null; 
} 
+0

問題是,如果我創建另一個我超過了內存 –

+0

你是否從一個文件得到這個位圖,如果是的,那麼你需要正確解碼以減小其大小以避免內存泄漏 –

+0

您可以提供文檔或snipet代碼嗎? –

0

這是代碼段的我用在我的項目中旋轉byte[]。它收到並返回byte[],但通過刪除最後5行代碼,它將返回Bitmap。它的工作原理奇觀:

public async Task<byte[]> RotateImage(byte[] source, int rotation) 
{ 
    //This is optional, use it to reduce your images a little 
    var options = new BitmapFactory.Options(); 
    options.InJustDecodeBounds = false; 
    options.InSampleSize = 2; 

    var bitmap = await BitmapFactory.DecodeByteArrayAsync(source, 0, source.Length, options); 
    Matrix matrix = new Matrix(); 
    matrix.PostRotate(rotation); 
    var rotated = Bitmap.CreateBitmap(bitmap, 0, 0, bitmap.Width, bitmap.Height, matrix, true); 

    var stream = new MemoryStream(); 
    await rotated.CompressAsync(Bitmap.CompressFormat.Jpeg, 100, stream); 
    var result = stream.ToArray(); 

    await stream.FlushAsync(); 
    return result; 
} 

所有awaitable呼叫具有非異步同行,所以這可以被轉換以阻止方式的重大問題不運行。請注意,刪除options變量可能會導致OutOfMemoryException,因此請確保在刪除之前知道您正在執行的操作。