2016-04-04 3 views
2

В настоящее время я разрабатываю приложение для Android, которое связано с некоторой обработкой изображений. После некоторых исследований, которые я сделал, я обнаружил, что лучше использовать Android NDK для обработки растровых изображений для хорошей производительности. Итак, я нашел некоторые основные примеры, как это:Android растровые операции с использованием ndk

static void myFunction(AndroidBitmapInfo* info, void* pixels){ 
    int xx, yy, red, green, blue; 
    uint32_t* line; 

    for(yy = 0; yy < info->height; yy++){ 
     line = (uint32_t*)pixels; 
     for(xx =0; xx < info->width; xx++){ 

      //extract the RGB values from the pixel 
      blue = (int) ((line[xx] & 0x00FF0000) >> 16); 
      green = (int)((line[xx] & 0x0000FF00) >> 8); 
      red = (int) (line[xx] & 0x00000FF); 

      //change the RGB values 

      // set the new pixel back in 
      line[xx] = 
        ((blue << 16) & 0x00FF0000) | 
        ((green << 8) & 0x0000FF00) | 
        (red & 0x000000FF); 
     } 

     pixels = (char*)pixels + info->stride; 
    } 
} 

Я использовал этот код и он работает очень хорошо для основных операций, но я хочу, чтобы сделать более сложный, как фильтр, где мне нужно получить доступ выше и ниже пикселей от текущего пикселя. Чтобы быть более конкретным, я приведу вам пример: для операций по расширению и эрозии мы перемещаемся по пикселям, и мы проверяем, находятся ли пиксели с севера на запад, север, северо-восток, запад, восток, юго-запад, юг и юго-восток (для 8 соседей) - это пиксели объектов. Мне нужно знать, как я могу получить доступ к значениям северного и южного пикселей, используя приведенный выше код. Я не очень хорошо разбираюсь в обработке изображений, используя C (указатели и т. Д.).

Спасибо!

ответ

0

Я редактировать ваши функции немного, в основном, чтобы получить позицию пикселя в массиве формула является:

положение = ширина у * + х

static void myFunction(AndroidBitmapInfo* info, void* pixels){ 
int xx, yy, red, green, blue; 
uint32_t* px = pixels; 

for(yy = 0; yy < info->height; yy++){ 
    for(xx =0; xx < info->width; xx++){ 

     int position = yy*info->width+xx;//this formula gives you the address of pixel with coordinates (xx; yy) in 'px' 

     //extract the RGB values from the pixel 
     blue = (int) ((line[position] & 0x00FF0000) >> 16); 
     green = (int)((line[position] & 0x0000FF00) >> 8); 
     red = (int) (line[position] & 0x00000FF); 

     //change the RGB values 

     // set the new pixel back in 
     line[position] = 
       ((blue << 16) & 0x00FF0000) | 
       ((green << 8) & 0x0000FF00) | 
       (red & 0x000000FF); 
     //so the position of the south pixel is (yy+1)*info->width+xx 
     //and the one of the north is (yy-1)*info->width+xx 
     //the left yy*info->width+xx-1 
     //the right yy*info->width+xx+1 
    } 
} 

если вы хотите прочитать/редактировать пиксель с координатами х, у

вы должны проверить, если 0 = < < у высоты и если 0 < = х < ширины, в противном случае вы можете получить доступ к unexisting пикселей, и вы будете иметь ошибку доступа к памяти

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