как отображать растровое изображение пиксель за пикселем? - PullRequest
4 голосов
/ 23 февраля 2012

Я пытаюсь отобразить растровое изображение попиксельно (что явно означает с некоторой задержкой). Я использую два цикла «для», чтобы сделать это, но он печатает только одну строку пикселей ...... если у кого есть идеи как это сделать ???? Пожалуйста помогите ..... мой код такой ........

Button start = (Button) findViewById(R.id.start);
start.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
            //Toast.makeText(getBaseContext(), "Printing...", Toast.LENGTH_SHORT).show();
             iImageArray = new int[bMap.getWidth()* bMap.getHeight()];                                   //initializing the array for the image size
             bMap.getPixels(iImageArray, 0, bMap.getWidth(), 0, 0, bMap.getWidth(), bMap.getHeight());   //copy pixel data from the Bitmap into the 'intArray' array  

             //Canvas canvas = new Canvas (bMap);
             //replace the red pixels with yellow ones  
             for (int i=0; i < bMap.getHeight(); i++)  
             {  
                 for(int j=0; j<bMap.getWidth(); j++)
                 {

                     iImageArray[j] = 0xFFFFFFFF;
                 } 
             } 
             bMap = Bitmap.createBitmap(iImageArray, bMap.getWidth(), bMap.getHeight(), Bitmap.Config.ARGB_8888);//Initialize the bitmap, with the replaced color
             image.setImageBitmap(bMap);
             //canvas.drawPoints(iImageArray, 0, bMap.getHeight()*bMap.getWidth(), paint);
        }
    });

и я хочу напечатать растровое изображение в оттенках серого, и для этого я нашел этот код ....

     public Bitmap toGrayscale(Bitmap bmpOriginal)
{        
    int width, height;
    height = bmpOriginal.getHeight();
    width = bmpOriginal.getWidth();    

    Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
    Canvas c = new Canvas(bmpGrayscale);
    Paint paint = new Paint();
    ColorMatrix cm = new ColorMatrix();
    cm.setSaturation(0);
    ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
    paint.setColorFilter(f);
    c.drawBitmap(bmpOriginal, 0, 0, paint);
    return bmpGrayscale;
}

iImageArray [i] = 0xFFFFFFFF; У меня есть это, чтобы проверить, а не фактическое значение оттенков серого .....

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

Ваш код выглядит в основном правильно, за исключением вашего внутреннего цикла.Ваш комментарий говорит, что вы устанавливаете их на желтый, но на самом деле вы сохраняете белый.Цикл будет влиять только на первую строку пикселей, потому что ваш индекс массива имеет диапазон от 0 до width-1.Вы можете либо рассчитать индекс путем умножения (i * width + j), либо сохранить счетчик с приращением.

Исходная версия:

//replace the red pixels with yellow ones  
for (int i=0; i < bMap.getHeight(); i++)  
{  
    for(int j=0; j<bMap.getWidth(); j++)
    {
        iImageArray[j] = 0xFFFFFFFF;
    } 
} 

ИсправленоВерсия:

//replace the red pixels with yellow ones
int iWidth = bMap.getWidth();  
for (int i=0; i < bMap.getHeight(); i++)  
{  
    for(int j=0; j<bMap.getWidth(); j++)
    {
        iImageArray[(i*iWidth)+j] = 0xFF00FFFF; // actual value of yellow
    } 
} 
0 голосов
/ 23 февраля 2012

Я также создал программу, которая считывает цвета RGB каждого пикселя изображения. Вот мой код для чтения:

int orgWidth = bmp.getWidth();
int orgHeight = bmp.getHeight();
//define the array size
int[] pixels = new int[orgWidth * orgHeight];

bmp.getPixels(pixels, 0, orgWidth, 0, 0, orgWidth, orgHeight);

for (int y = 0; y < orgHeight; y++){
    for (int x = 0; x < orgWidth; x++){
    }
}

Вот так работает мой массив. На прошлой неделе я задал вопрос о проверке дальнего пикселя, однако сам исправил его :) Оптимизация проверки цветового диапазона с вложенным циклом

EDIT:

Теперь я вижу, извините. в: iImageArray[j] = 0xFFFFFFFF; также добавьте iImageArray[i] = 0xFFFFFFFF; тогда должно работать

...