0

我正在开发一个应用程序,它必须以下列方式使用像素操作:围绕一个点(x,y)我必须在半径为 R 的圆中压缩或扩展像素,但我想保持矩形框用户界面图像。我通过以下方式获取原始数据(我在网上找到了这个):

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 的圆内?以及如何压缩/扩展这些像素?

谢谢

4

1 回答 1

1

使用毕达哥拉斯定理 - 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++;
    }
}

我不知道你的意思是压缩像素,但我相信你可以弄清楚你现在需要做什么......

于 2011-11-28T07:49:59.357 回答