2013-01-31 42 views
4

我正在嘗試處理一些直接來自設備攝像頭的圖像數據。爲了理解CGImage結構,我使用了一個緩衝區來創建一個不適合我的圖像(我知道我不應該在Obj-C代碼中使用C代碼,它只是爲了理解)。代碼如下:以編程方式在iOS中創建漸變圖像

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); 

這應該從一開始到最後像素創建漸變,但它導致了一個奇怪的圖形:

generated image

哪裏做橫向間距來自? (我想解決這個問題,我知道有其他的可能性來繪製漸變)在此先感謝。

回答

3

我已經找到了解決辦法:

我是用INT初始化緩衝區*。每個int都是4個字節長,但是灰度圖只需要每個像素1個字節。更改緩衝區爲char *和修改CGBitmapContextCreate參數固定的問題:

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

enter image description here

2

有幾種方法來實現你想要的。這裏有兩個例子: 請注意,這只是爲了向你展示一個例子,你應該添加參數/顏色/等等來獲得你想要的。希望這可以幫助。

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]; 
+0

謝謝您的回答。我意識到這些可能性,但基本上我試圖理解爲什麼代碼清單不工作(我需要爲CIImage提到的緩衝區) – Lukas