1

現在、iPhone用の基本的な画像エディターを作成しています。

CGImageRefa からを取得UIImageし、次のコードを使用してそのコンテキストを作成します

origImage = result.CGImage;

Iheight = CGImageGetHeight(origImage);
Iwidth = CGImageGetWidth(origImage);
IcolorSpace = CGColorSpaceCreateDeviceRGB();
IrawData = malloc(Iheight * Iwidth * 4);
IbytesPerPixel = 4;
IbytesPerRow = IbytesPerPixel * Iwidth;
IbitsPerComponent = 8;
Icontext = CGBitmapContextCreate(IrawData, Iwidth, Iheight, IbitsPerComponent,
                                 IbytesPerRow, IcolorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big
                                 );
//[bytesPerRow release];
CGContextSetBlendMode(Icontext, kCGBlendModeCopy);
CGContextDrawImage(Icontext, CGRectMake(0,0,Iwidth,Iheight),  origImage);

次に、ピクセルをループします

for (int x=0; x<Iwidth; x++) {
    for (int y=0; y<Iheight; y++) {
            //and  set the alpha component to 0
            int byteIndex = (y*IbytesPerRow) + x*IbytesPerPixel;

            IrawData[byteIndex+3] = 0;

            }
}

次に、コンテキストからCGImageRefを作成します

    CGImageRef imagea = CGBitmapContextCreateImage(Icontext);

CGImage を UIImage に追加し、UIImageView に割り当てます

問題は、アルファの変更が結果の画像に影響を与えていないことです

ピクセルの色を変更すると

IrawData[byteIndex+(0/1/2)]

色は変わりますが、ピクセルのアルファはまだ変更できません

ありがとうございました、

ダメダメダメ

4

1 に答える 1

5

アルファを変更する前に色の乗算を解除し、後で再度乗算することを忘れないでください。

事前に乗算された色 (「事前に乗算されたアルファ」と呼ばれることが多く、誤解を招く可能性があります) は、合成を容易にするために、色成分が既にアルファで乗算されて格納されていることを意味します。通常の合成 (ソース オーバー) 操作は次のようになります。

result = (source.rgb * source.a) + (destination.rgb * (1.0 - destination.a));

事前乗算は、最初の乗算が既に行われていることを意味するため、スキップできます。

result =  source.rgb             + (destination.rgb * (1.0 - destination.a));

事前に乗算された色成分を変更せずにアルファを変更しても、結果は変わりません。色は古いアルファによって事前に乗算されているため、画像を描画しても見た目は変わりません。

そのため、アルファを変更する前に、色の事前乗算を解除する必要があります。つまり、各色をアルファで除算します (以前は乗算されていたため、逆を行う必要があります)。次に、アルファを変更した後、色を新しいアルファで事前に乗算します。

もちろん、これは、アルファをゼロに変更すると、すべての色が黒くなる (r=g=b=0) ことを意味します。そのため、ユーザーが元の画像に戻したい場合は、元の画像を保持してください。

ユーザーが必要とする任意のアルファで元の画像を (アルファを変更せずに) 描画する方が、おそらくより効果的であり、確かに簡単です。これを行うには、画像を描画する前にディスプレイ コンテキストのグローバル アルファを変更します。

于 2010-09-01T12:55:13.360 に答える