在iOS中以编程方式创build渐变图像

我正在尝试处理一些来自设备相机的imagedata。 为了理解CGImage结构,我使用了一个缓冲区来创build一个不适合我的图像(我知道我不应该在Obj-C代码中使用C代码,这只是为了理解)。 代码如下:

int *outBuf = malloc(sizeof(int) * width * height); for (int i = 0; i < width * height;i ++) { outBuf[i] = (((float)i) / ((float) width * height)) * 255.f; } CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); CGContextRef ctx = CGBitmapContextCreate(outBuf, width, height, 8, width * 4, colorSpace, kCGImageAlphaNone); CGImageRef img = CGBitmapContextCreateImage(ctx); CFRelease(ref); CGContextRelease(ctx); free(outBuf); CGColorSpaceRelease(colorSpace); [view.imgView setImage: [UIImage imageWithCGImage:img]]; CGImageRelease(img); 

这应该从第一个到最后一个像素创build一个渐变,但是会导致一个奇怪的graphics:

生成的图像

水平间距从哪里来? (我想解决这个问题,我知道有其他的可能性来绘制渐变)在此先感谢。

我find了解决办法:

我用int *初始化缓冲区。 每个int都是4个字节长,但是灰度图只需要每个像素1个字节。 将缓冲区更改为char *并修改CGBitmapContextCreate参数可修复问题:

 CGBitmapContextCreate(outBuf, width, height, 8, width, colorSpace, kCGImageAlphaNone); 

在这里输入图像说明

有几种方法来实现你想要的。 这里有两个例子:请注意,这只是为了向您展示一个例子,您应该添加参数/颜色/等等来获得你正在做的事情。 希望这可以帮助。

1)直接绘制梯度图。 如果你想额外的绘图,也可以在你的视图实现中调用[super drawRect:rect]。

 - (void)drawRect:(CGRect)rect { CGPoint center = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds)); if (CGSizeEqualToSize(self.centerOffset, CGSizeZero) == NO) { center.x += self.centerOffset.width; center.y += self.centerOffset.height; } CGContextRef currentContext = UIGraphicsGetCurrentContext(); size_t num_locations = 2; CGFloat locations[2] = { 0.0, 1.0 }; CGFloat components[8] = { 0.0, 0.0, 0.0, 0.5, // Start color 0.0, 0.0, 0.0, 0.7 }; // End color CGColorSpaceRef rgbColorspace = CGColorSpaceCreateDeviceRGB(); CGGradientRef gradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations); CGGradientDrawingOptions options = kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation; CGFloat endRadius = [UIApplication sharedApplication].keyWindow.bounds.size.height / 2; CGContextDrawRadialGradient(currentContext, gradient, center, 50.0f, center, endRadius, options); CGGradientRelease(gradient); CGColorSpaceRelease(rgbColorspace); } 

2)使用Cagradient层

  UIColor *startEndColour = [UIColor redColor]; UIColor *middleColor = [UIColor blueColor]; NSArray *horizontalGradientColorsArray = [NSArray arrayWithObjects:(id)[startEndColour CGColor], (id)[middleColor CGColor],(id)[middleColor CGColor], (id)[startEndColour CGColor],nil]; UIView *horizontalGradient1View = [[UIView alloc] initWithFrame:CGRectMake(0.f, 0.f, self.bounds.size.width, 1.f)]; horizontalGradient1View.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin; CAGradientLayer *horizontalGradient1 = [CAGradientLayer layer]; horizontalGradient1.frame = horizontalGradient1View.bounds; horizontalGradient1.colors = horizontalGradientColorsArray; horizontalGradient1.startPoint = CGPointMake(0, 0.5); horizontalGradient1.endPoint = CGPointMake(1.0, 0.5); [horizontalGradient1View.layer insertSublayer:horizontalGradient1 atIndex:0]; [self addSubview:horizontalGradient1View]; [horizontalGradient1View release];