Применение наложения (фильтра изображений) к растровому изображению - PullRequest
5 голосов
/ 07 января 2012

Я пытаюсь захватить изображение с камеры и затем применить к нему фильтр изображения. Для разработки изображения будет изображение, снятое камерой, а фильтр изображений будет доступен в ресурсах в виде файла png. Я могу наложить фильтр поверх исходного изображения. Но после наложения исходное изображение становится «почти» невидимым (что означает, что фильтр фактически накладывается на исходное изображение, а не просто заменяет его). У меня есть пара изображений, чтобы проиллюстрировать мою проблему. Первое изображение было в фотошопе - когда я поместил фильтр поверх изображения, оно выглядело просто отлично. Второе изображение получено с помощью приведенного ниже кода - вы можете ясно увидеть, что эффект фильтра отсутствует. Будет ли кто-то иметь представление о том, почему происходит нечто подобное. Я скучаю по логике здесь?

Filterd Image - Photoshop

Filtered Image - via code

Ниже приведен код, который у меня есть. Я прошу прощения, если вы найдете какие-либо лучшие практики, отсутствующие здесь. Сначала я пытаюсь проверить код:

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);

}

РЕДАКТИРОВАТЬ 1: Я смог добиться некоторого прогресса с помощью статьи, которую предоставил Joru. Кажется, проблема в смешивании двух растровых изображений. Метод drawBitmap просто рисует одно растровое изображение над другим в ситуации, которая у меня есть. Следующая строка кода на самом деле попытается смешать 2 растровых изображения. Я также приложил изображение, которое изображает мой прогресс. Базовое растровое изображение теперь заметно более заметно:

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

Мне нужно еще немного поиграть с ним, прежде чем достичь желаемого результата. Color Filter - Revisited

1 Ответ

2 голосов
/ 07 января 2012

Вы можете попробовать несколько вещей:

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

Чтобы убедиться, что растровое изображение, которое вы открываете из MediaStore, имеет этот формат.Если это не так, это может вызвать вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...