2011-02-10 38 views

Trả lời

4

Khoảng một năm sau, tôi đã tìm thấy câu trả lời:

CGImageRef CGGenerateNoiseImage(CGSize size, CGFloat factor) CF_RETURNS_RETAINED { 
    NSUInteger bits = fabs(size.width) * fabs(size.height); 
    char *rgba = (char *)malloc(bits); 
    srand(124); 

    for(int i = 0; i < bits; ++i) 
     rgba[i] = (rand() % 256) * factor; 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); 
    CGContextRef bitmapContext = CGBitmapContextCreate(rgba, fabs(size.width), fabs(size.height), 
                 8, fabs(size.width), colorSpace, kCGImageAlphaNone); 
    CGImageRef image = CGBitmapContextCreateImage(bitmapContext); 

    CFRelease(bitmapContext); 
    CGColorSpaceRelease(colorSpace); 
    free(rgba); 

    return image; 
} 

này có hiệu quả tạo ra một hình ảnh tiếng ồn đó là bảo đảm là ngẫu nhiên, và có thể được rút ra, bằng cách sử dụng mã từ câu trả lời Jason Harwig của .

+0

Lưu ý rằng hình ảnh được trả về từ hàm này có số lần giữ lại +1 và cần được giải phóng bằng cách sử dụng CFRelease (hình ảnh) sau khi bạn vẽ xong. Nếu không, nó bị rò rỉ. Ngoài ra, tên của hàm nên được thay đổi để phản ánh điều này. Nó phải chứa "mới" hoặc "tạo" ở đâu đó. – Bryan

+0

Cảm ơn! Đã sửa bằng 'CF_RETURNS_RETAINED'. –

3

Tạo png tiếng ồn, sau đó vẽ nó bằng cách sử dụng lớp phủ hỗn hợp.

// draw background 
CGContextFillRect(context, ...) 

// blend noise on top 
CGContextSetBlendMode(context, kCGBlendModeOverlay); 
CGImageRef cgImage = [UIImage imageNamed:@"noise"].CGImage; 
CGContextDrawImage(context, rect, cgImage); 
CGContextSetBlendMode(context, kCGBlendModeNormal); 
+1

Bằng đồ họa lõi tinh khiết, tôi muốn vẽ nhiễu trong Đồ họa lõi ... Yêu cầu của ứng dụng của tôi là nó không sử dụng tệp png, thật đáng buồn. –

+0

Đó là một yêu cầu kỳ quặc. Tôi có thể thấy sự độc lập về độ phân giải là lý do, nhưng chỉ sử dụng hai png giải quyết khác nhau sẽ giải quyết điều đó. –

+0

Tuy nhiên, điều đó có thể hoạt động ... Có cách nào để mã hóa cứng UIImage dưới dạng dữ liệu văn bản mà tôi có thể mang về từ một lớp tùy chỉnh không? EDIT: Tôi sẽ không thể tạo ra một lớp wrapper tùy chỉnh với một st64 mã hóa st64 của hình ảnh trong định dạng Retina, và viết một vài phương pháp đơn giản để trả lại hình ảnh trong bất kỳ kích thước/định dạng? –

2

Có một CIRandomGenerator trong CoreImageFilters là của iOS 6. Nhưng hãy nhớ rằng điều này không phải là tiếng ồn gaussian (vì nó không có trong câu trả lời trước đó).

- (UIImage*)linearRandomImage:(CGRect)rect 
{ 
    CIContext *randomContext = [CIContext contextWithOptions:nil]; 
    CIFilter *randomGenerator = [CIFilter filterWithName: @"CIColorMonochrome"]; 
    [randomGenerator setValue:[[CIFilter filterWithName:@"CIRandomGenerator"] valueForKey:@"outputImage"] forKey:@"inputImage"]; 
    [randomGenerator setDefaults]; 

    CIImage *resultImage = [randomGenerator outputImage]; 
    CGImageRef ref = [randomContext createCGImage:resultImage fromRect:rect]; 
    UIImage *endImage=[UIImage imageWithCGImage:ref]; 
    return endImage; 
} 
Các vấn đề liên quan