我正在尝试处理一些直接来自设备相机的图像数据。为了理解CGImage结构,我使用缓冲区来创建一个对我来说不起作用的图像(我知道我不应该在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);
这应该创建从第一个像素到最后一个像素的渐变,但它会产生一个奇怪的图形:
水平间距来自哪里? (我想解决这个问题,我知道还有其他可能来绘制渐变)在此先感谢。
答案 0 :(得分:3)
我找到了解决方案:
我用int *初始化缓冲区。每个int长4个字节,但灰度图片每个像素只需要1个字节。将缓冲区更改为char *并修改CGBitmapContextCreate参数修复了问题:
CGBitmapContextCreate(outBuf, width, height, 8, width, colorSpace, kCGImageAlphaNone);
答案 1 :(得分:2)
有几种方法可以实现您的愿望。这是两个例子: 请注意,这只是为了向您展示一个示例,您应该添加参数/颜色/等以获得您正在追求的内容。希望这会有所帮助。
1)直接在绘制rect中绘制渐变。如果您想要额外的绘图,也可以在视图实现中调用[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 Layer
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];