2011-09-16 35 views
0

您好我有用於將圖像濾鏡內核數組轉換爲UIImage的代碼。但iPhone上的執行速度非常慢?你能有比這更好的代碼嗎?這是我的代碼。在iPhone上將內核數組轉換爲UIImage非常慢

- (UIImage*) applyConvolve:(NSArray*)kernel 
{ 
    CGImageRef inImage = self.CGImage; 
    CFDataRef m_DataRef = CGDataProviderCopyData(CGImageGetDataProvider(inImage)); 
    CFDataRef m_OutDataRef = CGDataProviderCopyData(CGImageGetDataProvider(inImage)); 
    UInt8 * m_PixelBuf = (UInt8 *) CFDataGetBytePtr(m_DataRef); 
    UInt8 * m_OutPixelBuf = (UInt8 *) CFDataGetBytePtr(m_OutDataRef); 

    int h = CGImageGetHeight(inImage); 
    int w = CGImageGetWidth(inImage); 

    int kh = [kernel count]/2; 
    int kw = [[kernel objectAtIndex:0] count]/2; 
    int i = 0, j = 0, n = 0, m = 0; 

    for (i = 0; i < h; i++) { 
     for (j = 0; j < w; j++) { 
      int outIndex = (i*w*4) + (j*4); 
      double r = 0, g = 0, b = 0; 
      for (n = -kh; n <= kh; n++) { 
       for (m = -kw; m <= kw; m++) { 
        if (i + n >= 0 && i + n < h) { 
         if (j + m >= 0 && j + m < w) { 
          double f = [[[kernel objectAtIndex:(n + kh)] objectAtIndex:(m + kw)] doubleValue]; 
          if (f == 0) {continue;} 
          int inIndex = ((i+n)*w*4) + ((j+m)*4); 
          r += m_PixelBuf[inIndex] * f; 
          g += m_PixelBuf[inIndex + 1] * f; 
          b += m_PixelBuf[inIndex + 2] * f; 
         } 
        } 
       } 
      } 
      m_OutPixelBuf[outIndex]  = SAFECOLOR((int)r); 
      m_OutPixelBuf[outIndex + 1] = SAFECOLOR((int)g); 
      m_OutPixelBuf[outIndex + 2] = SAFECOLOR((int)b); 
      m_OutPixelBuf[outIndex + 3] = 255; 
     } 
    } 

    CGContextRef ctx = CGBitmapContextCreate(m_OutPixelBuf, 
              CGImageGetWidth(inImage), 
              CGImageGetHeight(inImage), 
              CGImageGetBitsPerComponent(inImage), 
              CGImageGetBytesPerRow(inImage), 
              CGImageGetColorSpace(inImage), 
              CGImageGetBitmapInfo(inImage) 
              ); 

    CGImageRef imageRef = CGBitmapContextCreateImage(ctx); 
    CGContextRelease(ctx); 
    UIImage *finalImage = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef); 
    CFRelease(m_DataRef); 
    CFRelease(m_OutDataRef); 
    return finalImage; 

} 
+0

你的循環如下:woooowwww .... – Maulik

+0

啊......史詩循環! – 0xSina

回答

0

這是具有挑戰性的iOS4的修復。如果您能夠等待幾個月,請在預發佈文檔中搜索「CIFilter」,然後查看即將發佈的內容。

而且看看Jeff Lamarche's work in this area,雖然它沒有完全出爐。