2011-12-09 43 views
0

シンプルで効果的なエンボスエフェクトはCore Graphicsで行っています。 素晴らしいです!コアグラフィックエフェクト:シミュレータでは動作しますが、デバイスでは動作しません

1st image

私は以下の通りです何をすべきか:しかし、唯一のシミュレータで...ここ は結果である - 撮影画像から、それが持っている場合、私はアルファを取り出し、私は白でそれを埋めます。 - Iグレースケール に、このRGB画像を変換する - 私は、この画像の色を反転

私は、パラメータを使用して効果を作成するために、カスタムメソッドを呼び出します。

  • canvasImg:上マスクする半透明の画像
  • maskImg:私はちょうど作成した画像、グレースケール反転:

2nd image

  • opacitity:得られた画像

方法は、単純なマスクを作るの不透明度は、影とoppacityを適用し、真新しいUIImageを返します。 私はなぜそれが動作しないのか、デバイスであるのか理解できません。 デバイスで実行中に、私はnull以外のUIImageを取得します。 助けてください!ここ

コードである:また

- (UIImage *)stampImage:(UIImage *)canvasImg withMask:(UIImage *)maskImg withOpacity:(CGFloat)opacity 
{ 
//Creating the mask Image 
CGContextRef mainViewContentContext; 
CGColorSpaceRef colorSpace; 
colorSpace = CGColorSpaceCreateDeviceRGB(); 
mainViewContentContext = CGBitmapContextCreate(NULL, maskImg.size.width, maskImg.size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast); 
CGColorSpaceRelease(colorSpace); 

if (mainViewContentContext == NULL) return NULL; 

CGContextClipToMask(mainViewContentContext, CGRectMake(0, 0, maskImg.size.width, maskImg.size.height), maskImg.CGImage); 
CGContextDrawImage(mainViewContentContext, CGRectMake(0, 0, maskImg.size.width, maskImg.size.height), canvasImg.CGImage); 
CGContextSetAllowsAntialiasing(mainViewContentContext, true); 
CGContextSetShouldAntialias(mainViewContentContext, true); 
CGImageRef mainViewContentBitmapContext = CGBitmapContextCreateImage(mainViewContentContext); 
CGContextRelease(mainViewContentContext); 
UIImage *maskedImage = [UIImage imageWithCGImage:mainViewContentBitmapContext]; 
CGImageRelease(mainViewContentBitmapContext); 

//Giving some Drop shadows 
CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef shadowContext = CGBitmapContextCreate(NULL, maskedImage.size.width + 10, maskedImage.size.height + 10, 
                CGImageGetBitsPerComponent(maskedImage.CGImage), 0, 
                colourSpace, kCGImageAlphaPremultipliedLast); 
CGColorSpaceRelease(colourSpace); 
CGContextSetShadowWithColor(shadowContext, CGSizeMake(0, -1), 1, [UIColor colorWithWhite:1.0 alpha:0.3].CGColor); 
CGContextSetAllowsAntialiasing(shadowContext, true); 
CGContextSetShouldAntialias(shadowContext, true); 
CGContextDrawImage(shadowContext, CGRectMake(0, 10, maskedImage.size.width, maskedImage.size.height), maskedImage.CGImage); 
CGImageRef shadowedCGImage = CGBitmapContextCreateImage(shadowContext); 
CGContextRelease(shadowContext); 

UIImage *stampImg = [UIImage imageWithCGImage:shadowedCGImage]; 
CGImageRelease(shadowedCGImage); 

return stampImg; 

}

+1

端末ではどのような結果が表示されますか? –

+0

単に 'nil'を返せば' mainViewContentContext'が 'NULL'ではないことを確認しましたか? 'CGBitmapContextCreate()'への許可された入力はデスクトップ対デバイスで異なる可能性があります –

+0

ありがとうKevin。私はCGBitmapContextCreate()について考えないでください、それは問題かもしれません。私はそれを見てみましょう。 – DZenBot

答えて

1

シミュレータ対デバイスのメモリ制限に注意してください。私は、シミュレータ上でうまく構築され実行されるCGロジックを持っていました。同じロジックが構築され、デバイス上でエラーを出さずに実行されますが、視覚的な結果は望ましいものではありません。私はあなたのロジックをかなり小さいイメージで試して、デバイス上で動作することを確認することをお勧めします。私は、デバイスが大きな画像のためにそれを取り除くための馬力を持っていなかったので、私が思いつく、非常にクールな画像マスキング材料を放棄しなければならなかった。

+0

ビンゴ! 初めてのコードではなく、キャンバス画像です。 私はちょうど新しいイメージ、半透明、グレースケールを作成し、すべてがデバイス上で動作しました! あなたの返信にケビンとjstevencoありがとうございました:P – DZenBot

関連する問題