2012-01-06 35 views
5

Tôi đang cố gắng chụp ảnh từ ý định của máy ảnh và sau đó áp dụng bộ lọc hình ảnh trên đó. Để xây dựng hình ảnh sẽ là hình ảnh được máy ảnh chụp và bộ lọc hình ảnh sẽ có sẵn trong các tài nguyên dưới dạng tệp png. Tôi có thể phủ lên bộ lọc phía trên hình ảnh gốc. Nhưng, một khi overlay-ed hình ảnh ban đầu là 'gần như' vô hình (có nghĩa là bộ lọc là infact được xếp chồng lên nhau trên hình ảnh ban đầu và không chỉ thay thế nó). Tôi có một vài hình ảnh để minh họa cho vấn đề của tôi. Hình ảnh đầu tiên là trong Photoshop - khi tôi đặt một bộ lọc lên trên một hình ảnh, nó có vẻ tốt. Hình ảnh thứ hai được tạo ra bởi mã được trích dẫn bên dưới - bạn có thể thấy rõ rằng hiệu ứng bộ lọc bị thiếu. Có ai đó có một đầu mối là tại sao một cái gì đó như thế này đang xảy ra. Tôi có thiếu một số logic ở đây?Áp dụng một lớp phủ (bộ lọc hình ảnh) vào một Bitmap

Filterd Image - Photoshop

Filtered Image - via code

Sau đây là đoạn code mà tôi có. Tôi xin lỗi nếu bạn tìm thấy bất kỳ phương pháp hay nhất nào bị thiếu ở đây. Tôi ban đầu cố gắng để kiểm tra mã:

mPictureView = (ImageView) findViewById(R.id.pictureView); 
filterButton = (Button) findViewById(R.id.filter_button1); 

// define the threshold fro scaling the image 
private final double SCALE_THRESHOLD = 6.0; 

// acquire the bitmap (photo captured) from the Camera Intent - the uri is 
// passed from a previous activity that accesses the camera and the current 
// activity is used to display the bitmap 
Uri imageUri = getIntent().getData(); 
Bitmap imageBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri); 

// set the imageView in the current activity to display the picture retrieved 
// from the camera 
mPictureView.setImageBitmap(imageBitmap); 

// get the dimensions of the original bitmap 
int photoWidth = imageBitmap.getWidth(); 
int photoHeight = imageBitmap.getHeight(); 

filterButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
    // set the options 
    Options options = new BitmapFactory.Options(); 
    options.inScaled = false; 
    options.inPreferredConfig = Bitmap.Config.ARGB_8888; 

    // get the image (png file) filter from resources using the options 
    Bitmap filter = BitmapFactory.decodeResource(getResources(), R.drawable.colorful_filter,options); 

    // create a scaled copy of the filter 
    Bitmap filtercopy = Bitmap.createScaledBitmap(filter, (int)(photoWidth/SCALE_THRESHOLD,(int)(photoHeight/SCALE_THRESHOLD), true); 

    // recycle the used bitmap 
    filter.recycle(); 
    filter = null; 

    // get a scaled, mutable copy of the orginial image 
    Bitmap imagecopy = Bitmap.createScaledBitmap(imageBitmap,(int)(photoWidth/SCALE_THRESHOLD), (int)(photoHeight/SCALE_THRESHOLD),true); 

    // recycle the used bitmap  
    imageBitmap.recycle(); 
    imageBitmap = null; 


    Paint paint = new Paint(); 
    paint.setAntiAlias(true); 

    //paint.setAlpha(230); - if a discrete value is set, then the image beneath 
    // the filter is visible. But, I don't understand why I need to do this. 
    // Besides, that reduces the efficacy of the filter 

    // create a canvas with the original image as the underlying image  
    Canvas canvas = new Canvas(imagecopy); 
    // now, draw the filter on top of the bitmap 
    canvas.drawBitmap(filtercopy, 0, 0, paint); 

    // recycle the used bitmap    
    filtercopy.recycle(); 
    filtercopy = null; 

    //set the filtered bitmap as the image 
    mPictureView.setImageBitmap(imagecopy); 

} 

EDIT 1: Tôi đã có thể làm cho một số tiến bộ với sự giúp đỡ của các bài viết mà Joru đã cung cấp. Vấn đề có vẻ là với sự pha trộn của 2 bitmap. Phương thức drawBitmap sẽ chỉ vẽ một bitmap trên mặt khác trong tình huống mà tôi có. Dòng mã sau đây thực sự sẽ cố gắng pha trộn 2 bitmap. Tôi cũng đã đính kèm một hình ảnh mô tả sự tiến bộ của tôi. Bitmap cơ bản là đáng chú ý rõ ràng hơn bây giờ:

paint.setXfermode(new PorterDuffXfermode(Mode.MULTIPLY));  

tôi phải vẫn chơi đùa với nó một thời gian, trước khi đạt được kết quả mong muốn.Color Filter - Revisited

Trả lời

2

Bạn có thể thử một vài điều:

Bitmap new = old.copy(Config.ARGB_8888, true); 

Để đảm bảo bitmap bạn đang mở từ MediaStore là ở định dạng đó. Nếu không, điều đó có thể gây ra vấn đề của bạn.

+0

Cảm ơn bạn đã phản hồi. Tôi đã đảm bảo rằng cả hai hình ảnh đều có định dạng ARGB_8888. Có vẻ như bộ lọc đang mất đi sự minh bạch và tôi không thể hiểu tại sao. – Abhijit

+0

Đọc http://android.nakatome.net/2010/04/bitmap-basics.html này có thể trợ giúp. – Joru

+1

Bài viết này rất hữu ích. Tôi đã truyền một số ý tưởng được trình bày ở đó vào mã của tôi và nó đã cho thấy kết quả tích cực nhưng chưa hoàn thành. Vì vậy, tôi sẽ tiếp tục làm việc trên nó và đăng một giải pháp ngay sau khi tôi tìm ra nó. Cảm ơn một lần nữa - Tôi chấp nhận câu trả lời của bạn vì bạn đã chỉ cho tôi đúng hướng. – Abhijit

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