2012-01-06 19 views
5

Fotoğraf makinesinin amacından bir görüntü yakalamaya çalışıyorum ve üzerine bir görüntü filtresi uygulayacağım. Görüntüyü detaylandırmak için kamera tarafından çekilen bir görüntü ve görüntü filtresi bir png dosyası olarak kullanılabilir. Filtreyi orijinal görüntünün üstüne yerleştirebilirim. Ancak, bir kez üst üste bindirilen orijinal görüntü, 'neredeyse' görünmezdir (yani filtrenin, orijinal görüntüde yığılması ve sadece değiştirilmesi değil). Sorunumu göstermek için birkaç imge var. İlk görüntü Photoshop'ta idi - bir resmin üzerine bir filtre yerleştirdiğimde, iyi görünüyordu. İkinci görüntü, aşağıda belirtilen kod tarafından üretilmiştir - filtre efektinin eksik olduğunu açıkça görebilirsiniz. Birinin böyle bir şeyin neden oluştuğuna dair bir ipucu olur mu? Burada bazı mantığı kaçırıyor muyum? Bitmap'e bir kaplama (resim filtresi) uygulama

Filtered Image - via code

aşağıdaki

Filterd Image - Photoshop

Ben koddur. Burada eksik olan en iyi uygulamaları bulursanız özür dilerim. Başlangıçta kodu test etmek çalışıyorum:

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: Joru sağlamıştır makalenin yardımıyla bazı ilerlemeler yapmak başardı. Sorun 2 bitmap'lerin harmanlanmasıyla görünüyor. DrawBitmap yönteminde, sahip olduğum durumun diğer tarafında bir bitmap çizecekti. Aşağıdaki kod satırı aslında 2 bitmap'i karıştırmaya çalışır. Ayrıca ilerlememi gösteren bir resim ekledim. altta yatan bitmap şimdi fark daha görünür:

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

Hala istenilen çıktıyı elde etmeden önce, bir süre onunla uğraşmak zorunda.Color Filter - Revisited

cevap

2

Bir kaç şey deneyebilirsiniz:

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

Eğer MediaStore den açıyoruz bitmap bu biçimde olduğundan emin olmak için. Eğer değilse, bu probleminize neden olabilir.

+0

Yanıt için teşekkür ederiz. Her iki resmin de ARGB_8888 biçiminde olduğundan emin oldum. Filtre biraz şeffaflık kaybediyor gibi görünüyor ve nedenini anlayamıyorum. – Abhijit

+0

Bu http://android.nakatome.net/2010/04/bitmap-basics.html dosyasını okumak yardımcı olabilir. – Joru

+1

Bu makale çok yardımcı oldu. Orada sunulan fikirlerin bazılarını benim koduma aşıladım ve sonuçların henüz tam olmadığını ve olumlu olmadığını gösterdi. Bu yüzden, üzerinde çalışmaya devam edip anladığım kadarıyla bir çözüm yollayacağım. Tekrar teşekkürler - Bana doğru yönde işaret ettiğiniz için cevabınızı kabul ediyorum. – Abhijit