2010-07-14 45 views
5

Tôi đã có bitmap ... và nếu chiều cao của bitmap lớn hơn maxHeight hoặc chiều rộng lớn hơn maxWidth, tôi muốn cân đối lại kích thước hình ảnh sao cho nó vừa với maxWidth X maxHeight. Dưới đây là những gì tôi đang cố gắng:Tỷ lệ thay đổi kích thước một bitmap

BitmapDrawable bmp = new BitmapDrawable(getResources(), PHOTO_PATH); 

    int width = bmp.getIntrinsicWidth(); 
    int height = bmp.getIntrinsicHeight(); 

    float ratio = (float)width/(float)height; 

    float scaleWidth = width; 
    float scaleHeight = height; 

    if((float)mMaxWidth/(float)mMaxHeight > ratio) { 
     scaleWidth = (float)mMaxHeight * ratio; 
    } 
    else { 
     scaleHeight = (float)mMaxWidth/ratio; 
    } 

    Matrix matrix = new Matrix(); 
    matrix.postScale(scaleWidth, scaleHeight); 

    Bitmap out = Bitmap.createBitmap(bmp.getBitmap(), 
      0, 0, width, height, matrix, true); 

    try { 
     out.compress(Bitmap.CompressFormat.JPEG, 100, 
       new FileOutputStream(PHOTO_PATH)); 
    } 
    catch(FileNotFoundException fnfe) { 
     fnfe.printStackTrace(); 
    } 

tôi nhận được ngoại lệ sau đây:

java.lang.IllegalArgumentException: bitmap size exceeds 32bits

Tôi đang làm gì sai ở đây?

+0

Bạn có thể dán mã được sửa vào đây không? Tôi nhận được cùng một ngoại lệ – Mahesh

Trả lời

8

Tỷ lệ của bạnWidth và tỷ lệHighight phải là các yếu tố tỷ lệ (vì vậy không phải là số rất lớn) nhưng mã của bạn dường như vượt qua chiều rộng và chiều cao thực tế bạn đang tìm kiếm. Vì vậy, bạn sẽ tăng dần kích thước của bitmap của bạn.

Tôi nghĩ rằng có những vấn đề khác với mã để lấy được scaleWidth và scaleHeight. Đối với một điều, mã của bạn luôn có kích thước là scaleWidth = width hoặc scaleHeight = height và chỉ thay đổi một trong số đó, vì vậy bạn cũng sẽ làm biến dạng tỷ lệ co của hình ảnh. Nếu bạn chỉ muốn thay đổi kích thước hình ảnh thì bạn chỉ nên có một đơn lẻ scaleFactor.

Ngoài ra, tại sao câu lệnh if của bạn kiểm tra, hiệu quả, maxRatio> tỷ lệ? Bạn có nên kiểm tra chiều rộng > maxWidth hoặc > maxHeight?

1

Điều này là do giá trị của scaleWidth hoặc scaleHeight là quá lớn, scaleWidth hoặc scaleHeight là có nghĩa là phóng to hoặc thu nhỏ của tốc độ, nhưng không phải width hoặc height, chì tỷ lệ quá lớn để kích thước bitmap vượt quá 32 bit

matrix.postScale(scaleWidth, scaleHeight); 
1

đây là cách tôi đã thực hiện:

public Bitmap decodeAbtoBm(byte[] b){ 
    Bitmap bm; // prepare object to return 

    // clear system and runtime of rubbish 
    System.gc(); 
    Runtime.getRuntime().gc(); 

    //Decode image size only 
    BitmapFactory.Options oo = new BitmapFactory.Options(); 
    // only decodes size, not the whole image 
    // See Android documentation for more info. 
    oo.inJustDecodeBounds = true; 
    BitmapFactory.decodeByteArray(b, 0, b.length ,oo); 

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

    // Important function to resize proportionally. 
    //Find the correct scale value. It should be the power of 2. 
    int scale=1; 
    while(oo.outWidth/scale/2>=REQUIRED_SIZE 
      && oo.outHeight/scale/2>=REQUIRED_SIZE) 
      scale*=2; // Actual scaler 

    //Decode Options: byte array image with inSampleSize 
    BitmapFactory.Options o2 = new BitmapFactory.Options(); 
    o2.inSampleSize=scale; // set scaler 
    o2.inPurgeable = true; // for effeciency 
    o2.inInputShareable = true; 

    // Do actual decoding, this takes up resources and could crash 
    // your app if you do not do it properly 
    bm = BitmapFactory.decodeByteArray(b, 0, b.length,o2); 

    // Just to be safe, clear system and runtime of rubbish again! 
    System.gc(); 
    Runtime.getRuntime().gc(); 

    return bm; // return Bitmap to the method that called it 
} 
Các vấn đề liên quan