2

これはすでに尋ねられた質問ですが、どこにも見つからず、理解できない問題に直面しています。

私の目標は単純です。背景画像を描画し、その上に透明な画像を描画します。一番上の画像の透明度が弱い最初はうまく機能しますが、一番上の画像がほとんど透明になるとすぐに、結果の画像に奇妙な色が表示されます。

これが元の画像です: 元の画像 http://img406.imageshack.us/img406/7452/bidou.jpg

これが私が段階的に透明にする画像です: マスクhttp://img515.imageshack.us/img515/4464/loltest31.png(描画時にサイズを変更します。問題が発生した場合に備えて、元のサイズにしようとしました補間などから来ましたが、問題は解決しませんでした...)

そして今、いくらかの透明度を持つマスク: マスクのステップ 4 http://img19.imageshack.us/img19/3791/loltest4.png

そして結果: 結果ステップ 4

そして最後の結果は、マスクの透明度 (カラー データは変更せず、アルファ値のみを変更する) がほぼ完成したときです (アルファ = 7 (0 から 255 までのスケール)): 結果ステップ 1

ご覧のとおり、帽子の上の赤い点のように、結果に奇妙な色が表示され、透明度がどこでも同じレベルにあるようには見えません (マスクを保存して確認したためです)。 )。さらに、元の画像を変更せず、常に最初に描画したとしても、結果の画像の一部のゾーンは完全に透明になります。

マスクが完全に透明な場合、結果は元の画像と同じになりますが、アルファが 0 でなくなるとすぐに、それらの奇妙な色のピクセルが作成されます。

さまざまなブレンド モードを試しましたが、成功しませんでした。

コードで行う方法の1つを次に示します。

    UIImage *bottomImage = self.originalImage;
    UIImage *image       = [self getUIImage];

    CGSize newSize = mySize;
    UIGraphicsBeginImageContext( newSize );

    // Use existing opacity as is
    [bottomImage drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];

    // Apply supplied opacity if applicable
    [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];

    resultImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

そしてもう1つの方法(最終的には同じです):

CGSize mySize = self.originalImage.size;
UIGraphicsBeginImageContextWithOptions(mySize, YES, 0);
CGContextRef globalContext = UIGraphicsGetCurrentContext();

CGContextSaveGState(globalContext);

CGContextSetBlendMode(globalContext, kCGBlendModeNormal);
CGContextDrawImage(globalContext, CGRectMake(0, 0, mySize.width, mySize.height), self.originalImage.CGImage);
CGContextDrawImage(globalContext, CGRectMake(0, 0, mySize.width, mySize.height), [self getUIImage].CGImage);

CGImageRef   resultRef = CGBitmapContextCreateImage(globalContext);
UIImage*     resultImage = [UIImage imageWithCGImage:resultRef];

CGContextRestoreGState(globalContext);
UIGraphicsEndImageContext();

誰か、何か考えはありますか?試したことのないものは考えられません...

編集:単純な4 * 2画像の結果:

 Empty:
0: 0; 0; 0; 16
1: 0; 0; 0; 16
2: 0; 0; 0; 0
3: 0; 0; 0; 0
4: 0; 0; 0; 0
5: 0; 0; 0; 0
6: 0; 0; 0; 0
7: 0; 0; 0; 0

 Bottom drawn:
0: 0; 0; 0; 255
1: 128; 0; 0; 255
2: 128; 128; 0; 255
3: 0; 128; 0; 255
4: 0; 128; 128; 255
5: 0; 0; 128; 255
6: 128; 0; 128; 255
7: 128; 128; 128; 255

 foreground:
0: 0; 0; 0; 7
1: 128; 0; 0; 7
2: 128; 128; 0; 7
3: 0; 128; 0; 7
4: 0; 128; 128; 7
5: 0; 0; 128; 7
6: 128; 0; 128; 7
7: 128; 128; 128; 7

 front drawn:
0: 0; 0; 0; 255
1: 0; 128; 128; 192
2: 128; 128; 0; 0
3: 0; 128; 0; 255
4: 0; 128; 128; 255
5: 0; 0; 128; 255
6: 128; 0; 128; 0
4

0 に答える 0