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