Пиксельные манипуляции на iphone - PullRequest
0 голосов
/ 28 ноября 2011

Я работаю над приложением, которое должно использовать пиксельные манипуляции следующим образом: вокруг точки (x, y) я должен сгущать или расширять пиксели по кругу радиуса R, но я хочу сохранитьпрямоугольная рамка UIImage.Я получаю необработанные данные следующим образом (я нашел это в Интернете):

CGImageRef imageRef = image.CGImage;

NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
CFDataRef dataref = CopyImagePixels(imageRef);

unsigned char *rawData = CFDataGetBytePtr(dataref);

Итак, у меня есть в rawData данные пикселей.

int byteIndex = 0;
for (int ii = 0 ; ii < width * height ; ++ii)
{
    //now rawData[baseIndex] stands for red
    //rawData[baseIndex + 1] stands for green
    //rawData[baseIndex + 2] stands for blue

    byteIndex += 4;
}

Теперь, как мне узнать, находится ли текущий пиксель в пределах исходного круга (x, y) и радиуса R?И как мне сжать / расширить эти пиксели?

Спасибо

1 Ответ

1 голос
/ 28 ноября 2011

Используйте теорему Пифагора - a 2 + b 2 = c 2

c 2 легко:

CGFloat maxDistance = R*R;

Для каждого пикселя, учитывая его положение (xp, yp) - которое вы можете поддерживать в цикле - получите квадрат расстояния от начала координат и сравните с maxDistance:

int byteIndex = 0;
CGFloat xp = 0;
CGFloat yp = 0;

for (int ii = 0 ; ii < width * height ; ++ii)
{
    CGFloat xDist = xp - x;
    CGFloat yDist = yp - y;

    CGFloat dist = sqrt((xDist * xDist + yDist * yDist)) // Squares will be positive for comparison below...

    if (dist <= maxDistance) {
        ...
    }

    byteIndex += 4;
    if (++xp > width) {
        xp = 0;
        yp++;
    }
}

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

...