2011-02-08 7 views
1

単純なBox Blurを実装しようとしていますが、問題があります。つまり、画像をぼかす代わりに、各ピクセルを赤、緑、青または黒のいずれかに変換しているように見えます。何が起こっているか正確にはわからない。どんな助けもありがとう。Box Blur CGImageRef

このコードは、動作させるための最初のパスであることに注意してください。私はスピードについて心配していません。

- (CGImageRef)blur:(CGImageRef)base radius:(int)radius { 
CGContextRef ctx; 
CGImageRef imageRef = base; 
NSUInteger width = CGImageGetWidth(imageRef); 
NSUInteger height = CGImageGetHeight(imageRef); 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
unsigned char *rawData = malloc(height * width *4); 
NSUInteger bytesPerPixel = 4; 
NSUInteger bytesPerRow = bytesPerPixel * width; 
NSUInteger bitsPerComponent = 8; 
CGContextRef context = CGBitmapContextCreate(rawData, width, height, 
              bitsPerComponent, bytesPerRow, colorSpace, 
              kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
CGColorSpaceRelease(colorSpace); 

CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); 
CGContextRelease(context); 

char red = 0; 
char green = 0; 
char blue = 0; 
for (int widthIndex = radius; widthIndex < width - radius; widthIndex++) { 
    for (int heightIndex = radius; heightIndex < height - radius; heightIndex++) { 
     red = 0; 
     green = 0; 
     blue = 0; 
     for (int radiusY = -radius; radiusY <= radius; ++radiusY) { 
      for (int radiusX = -radius; radiusX <= radius; ++radiusX) { 

       int xIndex = widthIndex + radiusX; 
       int yIndex = heightIndex + radiusY; 

       int index = ((yIndex * width) + xIndex) * 4; 
       red += rawData[index]; 
       green += rawData[index + 1]; 
       blue += rawData[index + 2]; 
      } 
     } 

     int currentIndex = ((heightIndex * width) + widthIndex) * 4; 

     int divisor = (radius * 2) + 1; 
     divisor *= divisor; 

     int finalRed = red/divisor; 
     int finalGreen = green/divisor; 
     int finalBlue = blue/divisor; 

     rawData[currentIndex] = (char)finalRed; 
     rawData[currentIndex + 1] = (char)finalGreen; 
     rawData[currentIndex + 2] = (char)finalBlue; 
    } 
} 


ctx = CGBitmapContextCreate(rawData, 
          CGImageGetWidth(imageRef), 
          CGImageGetHeight(imageRef), 
          8, 
          CGImageGetBytesPerRow(imageRef), 
          CGImageGetColorSpace(imageRef), 
          kCGImageAlphaPremultipliedLast); 

imageRef = CGBitmapContextCreateImage (ctx); 

CGContextRelease(ctx); 

free(rawData); 
[(id)imageRef autorelease]; 
return imageRef; 
} 
+0

AH!私がこれを投稿するとすぐにそれを見つけました。私は文字として赤、緑、青を宣言していました。文字はすぐに折り返していたのでintでなければなりません。最初にその人に答えてください、私はそれらを受け入れるでしょう。 :) – MarkPowell

答えて

1

charの色はintとして宣言する必要があります。

int red = 0; 
int green = 0; 
int blue = 0; 
1

私はちょうどコメントがあります。私はこのスクリプトを使用し、それは本当にうまく動作します。唯一のことは、フレームがぼやけていない半径の幅を残していることです。ですから、私はそれを少し修正して、エッジの近くにミラーリング技術を使って全領域をぼかすようにしました。これらの行の後

// Mirroring the part between edge and blur raduis 
if (xIndex<0) xIndex=-xIndex-1; else if (xIndex>width-1) xIndex=2*width-xIndex-1; 
if (yIndex<0) yIndex=-yIndex-1; else if (yIndex>height-1) yIndex=2*height-yIndex-1; 

int xIndex = widthIndex + radiusX; 
int yIndex = heightIndex + radiusY; 

そして、ループ用のヘッダを置き換えます。これらを

for (int widthIndex = radius; widthIndex < width - radius; widthIndex++) { 
    for (int heightIndex = radius; heightIndex < height - radius; heightIndex++) { 

をこの1のために

は、以下の行を配置する必要がありますヘッダー:

for (int widthIndex = 0; widthIndex < width; widthIndex++) { 
    for (int heightIndex = 0; heightIndex < height; heightIndex++) {