0

Я использую методы getPixel и setPixel для моего Bitmap, и это так медленно (getPixels). Я хочу обработать каждый пиксель Bitmap, а затем создать еще один Bitmap. Как получить доступ к пикселям с помощью RenderScript или с помощью C++? Я думаю, что они быстрее, но я не знаю, как это сделать.Быстрая альтернатива для getPixel и getPixel в Android Bitmap?

Это то, что я с помощью getPixel/setPixel:

bitmap.getPixels(colorArray, 0, width, 0, 0, width, height); 

    for (int x = 0; x < width; x++) { 
     for (int y = 0; y < height; y++) { 
      int g = Color.green(colorArray[y * width + x]); 
      int b = Color.blue(colorArray[y * width + x]); 
      int r = Color.red(colorArray[y * width + x]); 
      //some color changes .... 
      colorArray[y * width + x] = Color.rgb(r, g, b); 
      returnBitmap.setPixel(x, y, colorArray[y * width + x]); 
     } 
    } 

Спасибо!

+0

, какой процесс вы делаете? вы вращаетесь, масштабируетесь, меняете цвета? должен ли процесс применяться в пиксельно-пиксельном подходе? –

+0

Я обновил вопрос, хочу изменить цвета. –

+0

Для ваших изменений цвета вам лучше использовать ** ColorMatrix ** вместо двухпетлевой двойной петли. –

ответ

1

Используйте getPixels(), чтобы получить все пиксели, изменить значения в byte[], а затем позвонить setPixels(), чтобы сохранить все пиксели одновременно. Накладные расходы при вызове setPixel() на каждый отдельный пиксель убивают вашу производительность.

Если он все еще не достаточно быстрый, вы можете передать массив функции NDK.

Если вы делаете живую обработку изображений с камеры, вы можете получить even fancier.

+2

ColorMatrix намного быстрее, чем цикл на пиксель (двойной). –

+0

@DerGolem Если у вас есть время собрать образец кода, вы должны написать это как ответ - я думаю, что это правильный подход. – fadden

+0

Извините, не в эти дни (я собираюсь закончить работу в спешке). Я думаю, оставил OP с чем-то, чтобы исследовать: ключевое слово, которое они могут найти и узнать, сколько вещей может позволить ColorMatrix (сепия тонировка, оттенок серого, тонирование цвета, негатив, ...). И при скорости варпа! –

1

Я нашел этот пример ColorMatrix

/* 
* Copyright (C) 2007 The Android Open Source Project 
* 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 

package com.example.android.apis.graphics; 

import com.example.android.apis.R; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.*; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.view.View; 

public class ColorMatrixSample extends GraphicsActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(new SampleView(this)); 
    } 

    private static class SampleView extends View { 
     private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     private ColorMatrix mCM = new ColorMatrix(); 
     private Bitmap mBitmap; 
     private float mSaturation; 
     private float mAngle; 

     public SampleView(Context context) { 
      super(context); 

      mBitmap = BitmapFactory.decodeResource(context.getResources(), 
                R.drawable.balloons); 
     } 

     private static void setTranslate(ColorMatrix cm, float dr, float dg, 
             float db, float da) { 
      cm.set(new float[] { 
        2, 0, 0, 0, dr, 
        0, 2, 0, 0, dg, 
        0, 0, 2, 0, db, 
        0, 0, 0, 1, da }); 
     } 

     private static void setContrast(ColorMatrix cm, float contrast) { 
      float scale = contrast + 1.f; 
       float translate = (-.5f * scale + .5f) * 255.f; 
      cm.set(new float[] { 
        scale, 0, 0, 0, translate, 
        0, scale, 0, 0, translate, 
        0, 0, scale, 0, translate, 
        0, 0, 0, 1, 0 }); 
     } 

     private static void setContrastTranslateOnly(ColorMatrix cm, float contrast) { 
      float scale = contrast + 1.f; 
       float translate = (-.5f * scale + .5f) * 255.f; 
      cm.set(new float[] { 
        1, 0, 0, 0, translate, 
        0, 1, 0, 0, translate, 
        0, 0, 1, 0, translate, 
        0, 0, 0, 1, 0 }); 
     } 

     private static void setContrastScaleOnly(ColorMatrix cm, float contrast) { 
      float scale = contrast + 1.f; 
       float translate = (-.5f * scale + .5f) * 255.f; 
      cm.set(new float[] { 
        scale, 0, 0, 0, 0, 
        0, scale, 0, 0, 0, 
        0, 0, scale, 0, 0, 
        0, 0, 0, 1, 0 }); 
     } 

     @Override protected void onDraw(Canvas canvas) { 
      Paint paint = mPaint; 
      float x = 20; 
      float y = 20; 

      canvas.drawColor(Color.WHITE); 

      paint.setColorFilter(null); 
      canvas.drawBitmap(mBitmap, x, y, paint); 

      ColorMatrix cm = new ColorMatrix(); 

      mAngle += 2; 
      if (mAngle > 180) { 
       mAngle = 0; 
      } 

      //convert our animated angle [-180...180] to a contrast value of [-1..1] 
      float contrast = mAngle/180.f; 

      setContrast(cm, contrast); 
      paint.setColorFilter(new ColorMatrixColorFilter(cm)); 
      canvas.drawBitmap(mBitmap, x + mBitmap.getWidth() + 10, y, paint); 

      setContrastScaleOnly(cm, contrast); 
      paint.setColorFilter(new ColorMatrixColorFilter(cm)); 
      canvas.drawBitmap(mBitmap, x, y + mBitmap.getHeight() + 10, paint); 

      setContrastTranslateOnly(cm, contrast); 
      paint.setColorFilter(new ColorMatrixColorFilter(cm)); 
      canvas.drawBitmap(mBitmap, x, y + 2*(mBitmap.getHeight() + 10), 
           paint); 

      invalidate(); 
     } 
    } 
} 

Взятые из http://alvinalexander.com/java/jwarehouse/android-examples/platforms/android-6/samples/ApiDemos/src/com/example/android/apis/graphics/ColorMatrixSample.java.shtml

Также кто-то еще имеет очень хороший ответ здесь в SO Understanding the Use of ColorMatrix and ColorMatrixColorFilter to Modify a Drawable's Hue

Смежные вопросы