Note that there are some explanatory texts on larger screens.

plurals
  1. POBlur an UIImage on change of slider
    text
    copied!<p>I have tried gaussian blur and checked out all the questions on stackoverflow but no one of them solved my crash issue.Please help is there is any other way to blur image other than gaussian blur algorithm. My image size is 768x1024 and the loops iterates for 2*1024*768 times and this is not feasible.</p> <pre><code>CGContextRef NYXImageCreateARGBBitmapContext(const size_t width, const size_t height, const size_t bytesPerRow) { /// Use the generic RGB color space /// We avoid the NULL check because CGColorSpaceRelease() NULL check the value anyway, and worst case scenario = fail to create context CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); /// Create the bitmap context, we want pre-multiplied ARGB, 8-bits per component CGContextRef bmContext = CGBitmapContextCreate(NULL, width, height, 8/*Bits per component*/, bytesPerRow, colorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedFirst); CGColorSpaceRelease(colorSpace); return bmContext; } -(UIImage*)blurredImageUsingGaussFactor:(NSUInteger)gaussFactor andPixelRadius:(NSUInteger)pixelRadius { CGImageRef cgImage = self.CGImage; const size_t originalWidth = CGImageGetWidth(cgImage); const size_t originalHeight = CGImageGetHeight(cgImage); const size_t bytesPerRow = originalWidth * 4; CGContextRef context = NYXImageCreateARGBBitmapContext(originalWidth, originalHeight, bytesPerRow); if (!context) return nil; unsigned char *srcData, *destData, *finalData; size_t width = CGBitmapContextGetWidth(context); size_t height = CGBitmapContextGetHeight(context); size_t bpr = CGBitmapContextGetBytesPerRow(context); size_t bpp = CGBitmapContextGetBitsPerPixel(context) / 8; CGRect rect = {{0.0f, 0.0f}, {width, height}}; CGContextDrawImage(context, rect, cgImage); // Now we can get a pointer to the image data associated with the bitmap // context. srcData = (unsigned char*)CGBitmapContextGetData(context); if (srcData != NULL) { size_t dataSize = bpr * height; finalData = malloc(dataSize); destData = malloc(dataSize); memcpy(finalData, srcData, dataSize); memcpy(destData, srcData, dataSize); int sums[gaussFactor]; size_t i, /*x, y,*/ k; int gauss_sum = 0; size_t radius = pixelRadius * 2 + 1; int *gauss_fact = malloc(radius * sizeof(int)); for (i = 0; i &lt; pixelRadius; i++) { gauss_fact[i] = 1 + (gaussFactor * i); gauss_fact[radius - (i + 1)] = 1 + (gaussFactor * i); gauss_sum += (gauss_fact[i] + gauss_fact[radius - (i + 1)]); } gauss_fact[(radius - 1) / 2] = 1 + (gaussFactor*pixelRadius); gauss_sum += gauss_fact[(radius - 1) / 2]; unsigned char *p1, *p2, *p3; for (size_t y = 0; y &lt; height; y++) { for (size_t x = 0; x &lt; width; x++) { p1 = srcData + bpp * (y * width + x); p2 = destData + bpp * (y * width + x); for (i = 0; i &lt; gaussFactor; i++) sums[i] = 0; for (k = 0; k &lt; radius ; k++) { if ((y - ((radius - 1) &gt;&gt; 1) + k) &lt; height) p1 = srcData + bpp * ((y - ((radius - 1) &gt;&gt; 1) + k) * width + x); else p1 = srcData + bpp * (y * width + x); for (i = 0; i &lt; bpp; i++) sums[i] += p1[i] * gauss_fact[k]; } for (i = 0; i &lt; bpp; i++) p2[i] = sums[i] / gauss_sum; } } for (size_t y = 0; y &lt; height; y++) { for (size_t x = 0; x &lt; width; x++) { p2 = destData + bpp * (y * width + x); p3 = finalData + bpp * (y * width + x); for (i = 0; i &lt; gaussFactor; i++) sums[i] = 0; for(k = 0; k &lt; radius ; k++) { if ((x - ((radius - 1) &gt;&gt; 1) + k) &lt; width) p1 = srcData + bpp * ( y * width + (x - ((radius - 1) &gt;&gt; 1) + k)); else p1 = srcData + bpp * (y * width + x); for (i = 0; i &lt; bpp; i++) sums[i] += p2[i] * gauss_fact[k]; } for (i = 0; i &lt; bpp; i++) { p3[i] = sums[i] / gauss_sum; } } } } size_t bitmapByteCount = bpr * height; ///////Here was the problem.. you had given srcData instead of destData.. Rest all //were perfect... CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, destData, bitmapByteCount, NULL); CGImageRef blurredImageRef = CGImageCreate(width, height, CGBitmapContextGetBitsPerComponent(context), CGBitmapContextGetBitsPerPixel(context), CGBitmapContextGetBytesPerRow(context), CGBitmapContextGetColorSpace(context), CGBitmapContextGetBitmapInfo(context), dataProvider, NULL, true, kCGRenderingIntentDefault); CGDataProviderRelease(dataProvider); CGContextRelease(context); if (destData) free(destData); if (finalData) free(finalData); UIImage* retUIImage = [UIImage imageWithCGImage:blurredImageRef]; CGImageRelease(blurredImageRef); return retUIImage; } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload