2012-05-25 3 views
1

Я хочу изменить цвет всех пикселей в UIImage. Этот код успешно меняет цвет для одной точки, но когда я запускаю его в цикле для всего изображения, тогда мое изображение исчезает. Сначала я прочитал значение цвета пикселя, затем применил изменения к цвету этого пикселя. Также цикл работает только для значения i. Ниже приведен кодИзменение значений цвета пикселя UIImage

UIImage *grayImage=[UIImage imageWithCGImage:source.CGImage]; 
      for(int i=0;i<imageToTest.frame.size.width;i++){ 
       for(int j=0;j<imageToTest.frame.size.height;j++){ 
        NSLog(@"%d",i); 
        CGPoint point=CGPointMake((CGFloat) i,(CGFloat) j); 
        if (!CGRectContainsPoint(CGRectMake(0.0f, 0.0f, source.size.width, source.size.height), point)) { 
         return nil; 
        } 

        NSInteger pointX = trunc(point.x); 
        NSInteger pointY = trunc(point.y); 
        CGImageRef cgImage = source.CGImage; 
        NSUInteger width = CGImageGetWidth(cgImage); 
        NSUInteger height = CGImageGetHeight(cgImage); 
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
        int bytesPerPixel = 4; 
        int bytesPerRow = bytesPerPixel * 1; 
        NSUInteger bitsPerComponent = 8; 
        unsigned char pixelData[4] = { 0, 0, 0, 0 }; 
        CGContextRef context = CGBitmapContextCreate(pixelData, 
                   1, 
                   1, 
                   bitsPerComponent, 
                   bytesPerRow, 
                   colorSpace, 
                   kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
        CGColorSpaceRelease(colorSpace); 
        CGContextSetBlendMode(context, kCGBlendModeCopy); 

         // Draw the pixel we are interested in onto the bitmap context 
        CGContextTranslateCTM(context, -pointX, -pointY); 
        CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, (CGFloat)width, (CGFloat)height), cgImage); 
        CGContextRelease(context); 

         // Convert color values [0..255] to floats [0.0..1.0] 
        CGFloat red = (CGFloat)pixelData[0]/255.0f; 
        CGFloat green = (CGFloat)pixelData[1]/255.0f; 
        CGFloat blue = (CGFloat)pixelData[2]/255.0f; 
        CGFloat alpha = (CGFloat)pixelData[3]/255.0f; 
        UIColor *currentPixelColor; 
        CGFloat Answer=sliderValue/10; 
        red=red*Answer; 
        green=green*Answer; 
        blue=blue*Answer; 
        alpha=alpha*Answer; 
        currentPixelColor=[UIColor colorWithRed:red green:green blue:blue alpha:alpha]; 


        int width2 = source.size.width; 
        int height2 = source.size.height; 

        CGColorSpaceRef colorSpace2 = CGColorSpaceCreateDeviceRGB();  
        CGContextRef context2 = CGBitmapContextCreate (nil, 
                    width2, 
                    height2, 
                    8, 
                    0, 
                    colorSpace2, 
                    kCGImageAlphaPremultipliedFirst); 

        CGColorSpaceRelease(colorSpace2); 

        if (context2 == NULL) { 
         return nil; 
        } 

        CGContextDrawImage(context2, 
             CGRectMake(0, 0, width2, height2), grayImage.CGImage); 

        CGContextSetFillColorWithColor(context2, currentPixelColor.CGColor); 
        CGContextFillRect(context2, CGRectMake(point.x, point.y, 1, 1)); 

        grayImage = [UIImage imageWithCGImage:CGBitmapContextCreateImage(context2)]; 
        CGContextRelease(context2); 

       } 

      } 


      return grayImage; 

} 

ответ

1

Я подозреваю, что вы работаете в этом состоянии и возвращает ноль (следовательно, ваше изображение исчезает):

if (!CGRectContainsPoint(CGRectMake(0.0f, 0.0f, source.size.width, source.size.height), point)) { 
    return nil; 
} 

Я думаю, что ваши итерации должны быть более source.size.width и source.size.height вместо размеров содержащего представления.

На боковой ноте вы, вероятно, итерации на высоком уровне. Вероятно, возможно (и, конечно же, более эффективно) создавать только на CGContextRef и применять все ваши изменения. Честно говоря, я не смотрел на ваш алгоритм достаточно близко, но вы должны попытаться взять все, что не нужно повторять снова и снова из вашего цикла.

+0

спасибо, что это сработало –

+0

любезно предложите мне простой способ выполнить эту задачу, потому что это не оптимальное решение для изменения цвета каждого пикселя –

+0

Это сообщение [http://stackoverflow.com/questions/7122221/how-to- реализация-fast-image-filters-on-ios-platform) может помочь вам – mprivat

0

Вы должны посмотреть на использование фильтров Core Image для настройки цвета. Они очень быстрые и довольно просты в использовании. Книга Эрика Садун «Поваренная книга разработчика iOS 5» содержит главу об использовании CI, которая очень понятна и проста в использовании. Он также включает в себя обход для ошибки ОС, которая мешает вам вернуть измененное изображение из Core Image в UIImage.

+0

как добавить coreImage.framework? –

Смежные вопросы