2009-09-13 43 views
6

以下は、このサイトからコピーしたコードです。元のコードはコンパイルされないため、少し修正しました。私は、エッジ検出と最終的に単純な色の変更のためのバイト配列を操作したいが、最初に私は基本的なコードを働かせたい。現在、システムはコンパイルされて実行されます。それはひどく描かれた象を画面に表示します。私が画像に触れると、それは消えます。ステップスルーすると、imageWithDataの結果が0x0として表示されます。私はpngとbmpの両方で同じ結果を試しましたNSDataからUiImageを作成します。

私が間違っていることの手掛かりはありますか?

@interface ImageViewDrawable : UIImageView 

// I am using the following code to initialize this ImageView 
ImageViewDrawable * uiv = [[ImageViewDrawable alloc] initWithImage:[UIImage imageNamed:@"ele.png"] ]; 

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    // get and work on pixel data 
    NSData* pixelData = (NSData*) CGDataProviderCopyData(CGImageGetDataProvider(self.image.CGImage)); 
    char* bytes =[pixelData bytes]; 

    // Take away the red pixel, assuming 32-bit RGBA 
    for(int i = 0; i < [pixelData length]; i += 4) { 
     bytes[i] = bytes[i]; // red 
     bytes[i+1] = bytes[i+1]; // green 
     bytes[i+2] = bytes[i+2]; // blue 
     bytes[i+3] = bytes[i+3]; // alpha 
    } 

    // convert pixel back to uiiimage 
    NSData* newPixelData = [NSData dataWithBytes:bytes length:[pixelData length]]; 
    char * bytes2 =[pixelData bytes]; 
    UIImage * newImage = [UIImage imageWithData:newPixelData] ; 
    [self setImage: newImage ]; 
} 

答えて

4

imageWithData:

ImageViewDrawableは以下のように定義されたいくつかの任意のデータを取り、RGBA非圧縮テクスチャとしてそれを解釈することはありません。認識されたイメージフォーマット(JPG、PNG、TIFFなど)のバイトを含むデータを取り込み、イメージを適切に解析し、イメージを適切に解凍します。

適切に設定されたCGContext(行バイト、ピクセルフォーマットなど)を作成する必要がある場合は、既にバッキングストレージとして割り当てられているメモリを使用するか、それからあなたのバイトをコピーしてください。これを行うと、そのコンテキストからUIImageを作成する機能を含む、CGContextに関連するすべての機能を使用できます。

+1

私は本質的に既存のUIImageから供給されているデータは問題ではありませんか? –

+0

私の問題がわかります。 CGDataProviderCopyData(CGImageGetDataProvider()) - このネストされた呼び出しセットは、データプロバイダを取得し、次にデータをコピーします。つまり、元の画像から残りの構成ではなく、ピクセルを取得するだけです。だから私はそれらのピクセルとあなたが参照したCG情報を使ってイメージを作り直さなければなりません。ヘルプありがとう –

関連する問題