2010-01-11 63 views
13

Tôi muốn hiển thị hình ảnh bằng phương thức drawBitmap(). Nhưng trước khi tôi muốn thay đổi kích thước nó theo kích thước màn hình. Tôi gặp vấn đề với chất lượng hình ảnh kết quả. Bạn có thể xem ảnh chụp màn hình và mã kiểm tra bên dưới. Làm thế nào tôi có thể thay đổi kích thước hình ảnh trong thời gian chạy với chất lượng tốt?android: chất lượng của hình ảnh được thay đổi kích thước trong thời gian chạy

Cảm ơn bạn đã giải pháp.

hình ảnh gốc: alt text http://dl.dropbox.com/u/709109/gradient.png

Kết quả chụp màn hình trên thiết bị: alt text http://dl.dropbox.com/u/709109/device.png

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Rect; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.LinearLayout; 

import java.io.IOException; 
import java.io.InputStream; 

public class MyActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     LinearLayout container = (LinearLayout) findViewById(R.id.container); 
     container.addView(new View(this) { 
      @Override 
      protected void onDraw(Canvas canvas) { 
       Bitmap unscaledBitmap; 
       try { 
        InputStream in = getAssets().open("images/gradient.png"); 
        unscaledBitmap = BitmapFactory.decodeStream(in); 
        in.close(); 
        canvas.drawBitmap(unscaledBitmap, null, new Rect(0, 0, 320, 480), null); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
} 

Trả lời

10

Vui lòng tham khảo Romain's answer bên dưới.

Tôi muốn xóa câu trả lời này, nhưng tôi không thể vì nó được đánh dấu là được chấp nhận.


Lưu ý rằng Android [khi câu trả lời này ban đầu được viết, mà không yêu cầu một cách rõ ràng màu 32-bit] sẽ chỉ làm màu 16-bit, do đó có thể có lần khi bạn nhận hiện vật không mong muốn.

Bạn cũng có thể thử sử dụng tùy chọn hoà sắc để yêu cầu Android tự động áp dụng phối màu, trong khi không hoàn hảo, có thể giúp mọi thứ trông đẹp hơn một chút.

+1

Cảm ơn bạn, đó là câu trả lời hữu ích! Nhưng tôi không có danh tiếng để bỏ phiếu. – shinydev

+0

Bây giờ tôi đang sử dụng "565 dither photoshop plugin" để chuẩn bị đồ họa của tôi. Bởi vì phối màu là hoạt động chi phí cao và nó không hoạt động với các phương thức decodeStream và drawBitmap. – shinydev

+1

Android có thể làm 32 bit tốt. Chỉ cần đảm bảo cả bitmap và cửa sổ của bạn đều sử dụng định dạng ARGB8888. –

2

Check-out http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html (Để được sử dụng với unscaledBitmap = BitmapFactory.decodeStream (in);

Bạn có thể thêm cài đặt chất lượng vào hình ảnh. Tôi đoán rằng chất lượng đang bị xuống cấp khi bạn không chuyển y cài đặt cho cách xử lý hình ảnh.

+0

"cài đặt chất lượng" trong 'BitmapFactory.Options' là gì? Tôi không thể thấy bất kỳ từ nào và từ "chất lượng" không xuất hiện một lần trong tài liệu. –

+0

Có http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inPreferQualityOverSpeed, nhưng các tài liệu nói nó chỉ đề cập đến giải mã JPEG và tệp của bạn là PNG. –

-1

Ngoài ra, nếu chức năng thay đổi kích thước của bạn không tôn trọng tỷ lệ cỡ ảnh, chất lượng sẽ bị ảnh hưởng. Bạn có thể tìm thấy một số thuật toán thay đổi kích thước trên web, ví dụ: check this out

+0

Không, cả hai hình ảnh đều có cùng tỷ lệ. hình ảnh gốc: tỷ lệ 600x900 1.5 kích thước hình ảnh mới: tỷ lệ hình ảnh 320x480 1.5 – shinydev

+0

Không tìm thấy bất kỳ thuật toán thay đổi kích thước nào tại liên kết bạn cung cấp. Chỉ cần thảo luận về tính toán giá trị quy mô chính xác ... – goRGon

15

Thay vì thay đổi kích thước tại thời gian vẽ (sẽ rất tốn kém), hãy thử thay đổi kích thước trong bitmap ngoài màn hình và đảm bảo rằng Bitmap là 32 bit (ARGB888).

+0

Như tôi đã tìm ra, Android đang áp dụng thuật toán downscaling tốt (không phải là hàng xóm gần nhất như) chỉ khi sử dụng *** BitmapFactory.Options :: inSampleSize-> BitmapFactory.decodeResource() ** * nhưng điều này cho phép chỉ hạ thấp chính xác chỉ số nguyên nhỏ hơn số nguyên bản. Có cách nào để downscale trong Android với một độ phân giải chính xác mà tôi cần sử dụng một cái gì đó tốt hơn so với thuật toán lân cận gần nhất (được sử dụng mỗi khi tôi gọi createScaledBitmap(), createBitmap + matrix và e.t.c.)? – goRGon

1

Triển khai các phương pháp createScaledBitmap (..) trên nền tảng cũ (cấp API < 12) vấn đề gây ra khi bạn cố gắng để mở rộng quy mô một ARGB_8888 Bitmap không có giá trị alpha thực (tức là mỗi pixel có alpha = 255), vì cờ hasAlpha của chúng được đặt thành false. Trong trường hợp đó, Bitmap thu nhỏ được tự động chuyển đổi sang định dạng RGB_565.

Vì vậy kể từ mức API 12 có một phương pháp (trong lớp Bitmap)

setHasAlpha(boolean value); 

nào giúp ngăn ngừa một sự chuyển đổi khi sử dụng createScaledBitmap (..).

Có một cách để sử dụng cùng một phương pháp ở cấp API> 3. Đã có mặt trong một thời gian rất dài, chỉ bị ẩn.Tất cả các bước cần thiết bao gồm mã nguồn được mô tả tại đây:

https://stackoverflow.com/a/12202069/1082933

Hy vọng điều này sẽ hữu ích.

Các vấn đề liên quan