因此,最近我仅使用核心图形就编写了许多图像处理代码,并且我制作了许多工作滤镜来操纵颜色,应用混合,模糊和类似的东西。但是我在编写过滤器以将像点效果应用到这样的图像时遇到了麻烦:

我想做的是获取一个像素的颜色,并用该颜色填充一个椭圆,遍历整个图像,并在代码中每隔几个像素执行一次操作:

编辑:这是我的新代码,这一次它只是在图像的底部绘制了一些小圆圈,我是否像你说的那样正确?

-(UIImage*)applyFilterWithAmount:(double)amount {

CGImageRef inImage = self.CGImage;
CFDataRef m_dataRef = CGDataProviderCopyData(CGImageGetDataProvider(inImage));
UInt8* m_pixelBuf = (UInt8*)CFDataGetBytePtr(m_dataRef);

int length = CFDataGetLength(m_dataRef);

CGContextRef ctx = CGBitmapContextCreate(m_pixelBuf,
                                    CGImageGetWidth(inImage),
                                    CGImageGetHeight(inImage),
                                    CGImageGetBitsPerComponent(inImage),
                                    CGImageGetBytesPerRow(inImage),
                                    CGImageGetColorSpace(inImage),
                                    CGImageGetBitmapInfo(inImage));

int row = 0;
int imageWidth = self.size.width;

if ((row%imageWidth)==0) {
    row++;
}

int col = row%imageWidth;

for (int i = 0; i<length; i+=4) {
    //filterPointillize(m_pixelBuf, i, context);

    int r = i;
    int g = i+1;
    int b = i+2;

    int red = m_pixelBuf[r];
    int green = m_pixelBuf[g];
    int blue = m_pixelBuf[b];

    CGContextSetRGBFillColor(ctx, red/255, green/255, blue/255, 1.0);
    CGContextFillEllipseInRect(ctx, CGRectMake(col, row, amount, amount));
}

CGImageRef imageRef = CGBitmapContextCreateImage(ctx);
CGContextRelease(ctx);
UIImage* finalImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
CFRelease(m_dataRef);
return finalImage;

}

最佳答案

我马上就发现的一个问题是,您正在同时使用X和Y原点的栅格像元编号。这种配置中的栅格只是一条尺寸线。您可以根据光栅图像的宽度来计算第二维。那可以解释你为什么要排队。

另一件事:似乎您正在读取图像的每个像素。您是否不想跳过尝试绘制的椭圆宽度的像素?

接下来看起来可疑的是我认为您应该在绘制之前创建要绘制的上下文。此外,您不应致电:

CGContextRef contextRef = UIGraphicsGetCurrentContext();
CGContextSaveGState(contextRef);


CGContextRestoreGState(contextRef);

在循环内。

编辑:

进一步观察:您读取的RGB值为0-255,并且CGContextSetRGBFillColor函数期望值在0.f-1.f之间。这可以解释为什么你变白了。因此,您需要除以255:
CGContextSetRGBFillColor(contextRef, red / 255, green / 255, blue / 255, 1.0);

如果您还有其他问题,请随时提出!

编辑2:

要计算行,请首先在循环外声明一个行计数器:
int row = 0; //declare before the loop

int imageWidth = self.size.width; //get the image width

if ((i % imageWidth) == 0) { //we divide the cell number and if the remainder is 0
                             //then we want to increment the row counter
    row++;
}

我们还可以使用mod来计算当前列:
int col = i % imageWidth; //divide i by the image width. the remainder is the col num

编辑3:
您必须将其放入for循环中:
if ((row%imageWidth)==0) {
    row++;
}

int col = row%imageWidth;

另外,我之前也没有提到,要使列和行基于0(这是您想要的),您需要从图像大小中减去1:
 int imageWidth = self.size.width - 1;

关于objective-c - 核心图形在CGImage上点画效果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11771505/

10-12 16:05