Objective c 核心图形点化对CGImage的影响

Objective c 核心图形点化对CGImage的影响,objective-c,ios,c,image-processing,core-graphics,Objective C,Ios,C,Image Processing,Core Graphics,因此,我最近只使用核心图形编写了很多图像处理代码,并且我制作了很多工作过滤器,用于处理颜色、应用混合、模糊等。但是我很难编写一个过滤器来对这样的图像应用点化效果: 我想做的是得到一个像素的颜色,用这个颜色填充一个椭圆,在图像中循环,每隔几个像素做一次,代码如下: 编辑:这是我这次的新代码,它只是在图片的底部画了几个小圆圈,我是不是像你说的那样做对了 -(UIImage*)applyFilterWithAmount:(double)amount { CGImageRef inImage = s

因此,我最近只使用核心图形编写了很多图像处理代码,并且我制作了很多工作过滤器,用于处理颜色、应用混合、模糊等。但是我很难编写一个过滤器来对这样的图像应用点化效果:

我想做的是得到一个像素的颜色,用这个颜色填充一个椭圆,在图像中循环,每隔几个像素做一次,代码如下:

编辑:这是我这次的新代码,它只是在图片的底部画了几个小圆圈,我是不是像你说的那样做对了

-(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;
-(UIImage*)应用过滤器,其金额为:(双倍)金额{
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行=0;
int imageWidth=self.size.width;
如果((行%imageWidth)==0){
行++;
}
int col=行%imageWidth;

对于(int i=0;i我马上就看到了一个问题,即您正在为X和Y原点使用光栅单元编号。此配置中的光栅只是一条尺寸线。您可以根据光栅图像的宽度计算第二个尺寸。这可以解释为什么要有一条线

另一件事:看起来你们正在读取图像的每一个像素。难道你们不想跳过你们正试图绘制的椭圆宽度的像素吗

下一件看起来可疑的事情是,我认为您应该在绘图之前创建您正在绘制的上下文。此外,您不应该调用:

CGContextRef contextRef = UIGraphicsGetCurrentContext();
CGContextSaveGState(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;

CMD+Z通常是记住过去所做事情的方法…是的,我运行了代码,但后来撤消选项不可用。我也在考虑不包括y维度。你能告诉我如何分别循环列和行吗?是的,我将跳过像素,我只是还没有添加。啊,对吗我忘了除以255,我在我的其他过滤器中是这么做的,但这一个似乎忘记了。谢谢!我会尽快给你50个信誉点。好的,我根据你说的做了一点修改。检查我的编辑。请查看编辑3。在按照编辑3进行更改后,请发布测试图像结果。好的,整个图像e现在变黑了。顺便说一句,我添加了你的声誉积分,非常感谢你帮助我。问题似乎出在CGContextRef上
 int imageWidth = self.size.width - 1;