Как альфа-маскировать цвет - PullRequest
4 голосов
/ 15 декабря 2010

Работая в Android (1.5), у меня есть около ста изображений в градациях серого в виде байтовых массивов.Я хочу использовать изображения в качестве альфа-маски для рисования сплошных цветов на холсте.Изображения исправлены, но цвета могут измениться.Я могу создавать растровые объекты для каждой комбинации изображения / цвета, но это кажется ужасно неэффективным.Что было бы хорошим способом решения этой проблемы с точки зрения как памяти, так и скорости?(Мне нужно делать это много раз для каждого комбинированного изображения / цвета.)

Ответы [ 3 ]

4 голосов
/ 16 декабря 2010

Я думаю, что нашел ответ, который искал:

  1. Создайте растровое изображение ARGB_8888, в котором для каждого цвета пикселя установлено значение (серый << 24) | 0xFFFFFF. </li>
  2. Для каждого цвета создайте новый PorterDuffColorFilter (color, PorterDuff.Mode.MULTIPLY).
  3. Для визуализации создайте объект Paint и вызовите setColorFilter () с фильтром, соответствующим используемому цвету. Затем вызовите canvas.drawBitmap, используя объекты Bitmap и Paint.

Для одного цвета это, вероятно, не так быстро, как создание именно точного растрового изображения, которое я хочу, и рисование без объекта Paint, но это намного более эффективно, чем растровое изображение, для каждого комбинированного изображения / цвета.

1 голос
/ 05 мая 2012

контрастность с плавающей точкой = 100 / 180.f; шкала с плавающей запятой = контраст + 1.f;

        cm.set(new float[] {
               scale, 0, 0, 0, 0,//Red
               0, 1.5f, 0, 0, 0,//Green
               0, 0, 1.5f, 0, 0,//Blue
               0, 0, 0, 1, 0 });//alpha
        bmpGrayscale = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.RGB_565);

        Canvas c = new Canvas(bmpGrayscale);
        Paint paint = new Paint();

        ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
        paint.setColorFilter(f);
        c.drawBitmap(bitmap, 0, 0, paint);
        /*BitmapDrawable bmd = new BitmapDrawable(bmpGrayscale);
        photo_view.setBackgroundDrawable(bmd);*/

        photo_view.setImageBitmap(bmpGrayscale);
0 голосов
/ 16 декабря 2010

Я бы использовал drawImage для перетаскивания изображения на холст, getImageData() для доступа к пикселям, а затем зацикливался на .data данных изображения, устанавливая значения RGB для каждого пикселя в качестве вашей постоянной и четвертое (альфа) значение к тому, что вы получили от изображения. Затем вы можете наложить этот полупрозрачный холст поверх всего, что вам нужно.

Редактировать : Я разместил рабочий пример этого на своем веб-сайте. Работает только на Chrome / Safari.

...