Как скопировать пиксели из одного растрового изображения в другое в форме круга? - PullRequest
1 голос
/ 28 октября 2010

Я использую функции setPixel и getPixel, но они используют матрицы, которые естественно являются прямоугольниками. Я пытаюсь скопировать пиксели в форме круга!

обновление: сейчас я использую это, но я надеюсь, что есть что-то более эффективное, чем это:

for(int i=0;i<eHeight ; i++)
        for(int j=0;j<eWidth ; j++)
            if( Math.pow((i-eHeight/2),2) +  Math.pow((j-eWidth/2),2) < Math.pow((eHeight/2),2)) 
                mutable.setPixel((int)xpos+j, (int)ypos+i, r[i*eWidth + j]) ;

Ответы [ 2 ]

2 голосов
/ 28 октября 2010

Если ваш круг зафиксирован, могу поспорить, есть способ использовать маски, чтобы сделать это очень быстро - поиск в Google говорит мне, что PorterDuffXfermode - это то, что вам нужно.

В противном случае вы можете сэкономить время, выполняя вычисления более эффективно. Во-первых, не используйте пау, чтобы выровнять вещи. Во-вторых, предварительно вычислите ваш радиус за пределами цикла. Ваш теоретический компилятор все исправит за вас, но не рассчитывайте на это.

В-третьих, рассмотрите возможность использования алгоритма круга Брезенхэма , чтобы найти начало и конец каждой строки круга, а затем скопируйте пиксели по одной строке за раз вместо одного пикселя за раз.

0 голосов
/ 28 октября 2010

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

(x - h)^2 + (y - k)^2 = r^2
...