2011-11-30 12 views
14

Tôi có một Bitmap với kích thước của 320x480 và tôi cần phải căng nó trên màn hình thiết bị khác nhau, tôi đã cố gắng sử dụng này:Làm thế nào để thay đổi kích thước một bitmap eficiently và với ra chất lượng mất đi trong android

Rect dstRect = new Rect(); 
canvas.getClipBounds(dstRect); 
canvas.drawBitmap(frameBuffer, null, dstRect, null); 

nó hoạt động , hình ảnh lấp đầy toàn bộ màn hình như tôi muốn nhưng hình ảnh được pixelated và có vẻ xấu. Sau đó, tôi đã cố gắng:

float scaleWidth = (float) newWidth/width; 
float scaleHeight = (float) newHeight/height; 
Matrix matrix = new Matrix(); 
matrix.postScale(scaleWidth, scaleHeight); 
Bitmap resizedBitmap = Bitmap.createBitmap(frameBuffer, 0, 0, 
       width, height, matrix, true); 
canvas.drawBitmap(resizedBitmap, 0, 0, null); 

thời gian này có vẻ hoàn hảo, đẹp và mịn, nhưng mã này có được trong vòng đấu chính của tôi và tạo Bitmap s mỗi lần lặp làm cho nó rất chậm. Làm thế nào tôi có thể thay đổi kích thước hình ảnh của tôi để nó không được pixelated và được thực hiện nhanh chóng?

tìm thấy giải pháp:

Paint paint = new Paint(); 
paint.setFilterBitmap(); 
canvas.drawBitmap(bitmap, matrix, paint); 
+2

Nếu bạn tìm thấy giải pháp của riêng mình, bạn nên thêm giải pháp đó làm câu trả lời cho câu hỏi của mình và tự chấp nhận câu hỏi để người khác không thêm câu trả lời không mong muốn cho câu hỏi của bạn. – Kuffs

Trả lời

33

Thay đổi kích thước một Bitmap:

public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) 
{ 
    int width = bm.getWidth(); 
    int height = bm.getHeight(); 
    float scaleWidth = ((float) newWidth)/width; 
    float scaleHeight = ((float) newHeight)/height; 
    // create a matrix for the manipulation 
    Matrix matrix = new Matrix(); 
    // resize the bit map 
    matrix.postScale(scaleWidth, scaleHeight); 
    // recreate the new Bitmap 
    Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false); 
    return resizedBitmap; 
} 

Khá tự giải thích: chỉ cần đầu vào đối tượng gốc Bitmap và kích thước mong muốn của Bitmap, và phương pháp này sẽ trở lại với bạn Bitmap mới được thay đổi kích cỡ! Có thể, nó rất hữu ích cho bạn.

+0

@ user924941 Thay đổi kích thước một lần này tốt hơn thay đổi kích thước mỗi khung hình. –

+4

để có hình ảnh được chia tỷ lệ chất lượng tốt hơn Thay đổi kích thước bitmapBitmap = Bitmap.createBitmap (bm, 0, 0, chiều rộng, chiều cao, ma trận, đúng); –

+0

@BorisKarloff: Đặt thông số bộ lọc không có tác dụng khi tăng tỷ lệ, mà OP quan tâm đến việc thực hiện. –

0

Tôi đang sử dụng giải pháp trên để thay đổi kích thước bitmap. Nhưng nó kết quả một phần của hình ảnh bị mất.

Đây là mã của tôi.

BitmapFactory.Options bmFactoryOptions = new BitmapFactory.Options(); 
      bmFactoryOptions.inPreferredConfig = Bitmap.Config.ARGB_8888; 
      bmFactoryOptions.inMutable = true; 
      bmFactoryOptions.inSampleSize = 2; 
      Bitmap originalCameraBitmap = BitmapFactory.decodeByteArray(pData, 0, pData.length, bmFactoryOptions); 
      rotatedBitmap = getResizedBitmap(originalCameraBitmap, cameraPreviewLayout.getHeight(), cameraPreviewLayout.getWidth() - preSizePriviewHight(), (int) rotationDegrees); 

public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight, int angle) { 
     int width = bm.getWidth(); 
     int height = bm.getHeight(); 
     float scaleWidth = ((float) newWidth)/width; 
     float scaleHeight = ((float) newHeight)/height; 
     Matrix matrix = new Matrix(); 
     matrix.postRotate(angle); 
     matrix.postScale(scaleWidth, scaleHeight); 
     Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true); 
     DeliverItApplication.getInstance().setImageCaptured(true); 
     return resizedBitmap; 
    } 

Và đây là chiều cao và chiều rộng: kích thước Preview bề mặt: 352: 288 Trước khi chiều rộng bitmap thay đổi kích cỡ: 320 Chiều cao: 240 chiều rộng CameraPreviewLayout: 1080 Chiều cao: 1362 thay đổi kích thước chiều rộng bitmap: 1022 Chiều cao: 1307