0

だから私はこのプログラムに取り組んでおり、何らかの理由でピンクが透明にならないので、ここに私のコードがあります:

if (chatIcons.GetPixel(x, y) == Color.FromArgb(255, 0, 255) || chatIcons.GetPixel(x, y) == Color.FromArgb(0, 255, 255))
{
chatIcons.SetPixel(x, y, Color.FromArgb(0, 0, 0, 0));
}

0, 255, 255 はシアン (動作) 255, 0, 255 はピンク (動作しない) なぜですか? コードは一方のビットでは機能しますが、もう一方のビットでは機能しません。

ああ、ここに私のイメージがあります: ここに画像の説明を入力

4

3 に答える 3

1

Axialis で画像を開くと、この結果が表示されました (変更はありませんが、キャプチャのためにズームされています)...

ズームした

したがって、これは、画像内のエンコーディングが、ピンク色のピクセルが一部のデコーダーによって透過的であると解釈され、他のデコーダーでは透過的でないと解釈されるようなものであるという結論につながります。Photoshop は、期待どおりに画像をデコードして表示しました。ピンクのピクセルに影響を与えるエンコーディングを「オーバーライド」するには、Photoshop で開いて保存する必要がある場合があります。

色検出のコードについても。Photoshop を使用した非常に深いズームでは、ピクセルの約 10 ~ 20% で、あなたのような正確な検出方法が失敗する可能性が高い程度まで、多くのアーティファクトが明らかになりました。「IsNearlyPink」に沿った検出方法を検討できます。

下のPhotoshopズーム...

ここに画像の説明を入力

于 2013-07-20T22:31:49.267 に答える
1

そのビットマップの場合 (および画像がアルファをサポートしている場合)、これを試すことができます:

chatIcons = ChangeColor(chatIcons,(byte)255,(byte)0,(byte)255);

public static Bitmap ChangeColor(Bitmap sourceBitmap, byte blue, byte green, byte red)
{
       BitmapData sourceData = sourceBitmap.LockBits(new Rectangle(0, 0,
                                    sourceBitmap.Width, sourceBitmap.Height),
                                    ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);

       byte[] pixelBuffer = new byte[sourceData.Stride * sourceData.Height];

       Marshal.Copy(sourceData.Scan0, pixelBuffer, 0, pixelBuffer.Length);

       sourceBitmap.UnlockBits(sourceData);

       for (int k = 0; k + 4 < pixelBuffer.Length; k += 4)
       {
           if (pixelBuffer[k] == blue && pixelBuffer[k + 1] == green && pixelBuffer[k + 2] == red)
           {
                pixelBuffer[k] = 0;
                pixelBuffer[k + 1] = 0;
                pixelBuffer[k + 2] = 0;
                pixelBuffer[k + 3] = 0;
           }
        }

        Bitmap resultBitmap = new Bitmap(sourceBitmap.Width, sourceBitmap.Height);

        BitmapData resultData = resultBitmap.LockBits(new Rectangle(0, 0,
                                    resultBitmap.Width, resultBitmap.Height),
                                    ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);

         Marshal.Copy(pixelBuffer, 0, resultData.Scan0, pixelBuffer.Length);
            resultBitmap.UnlockBits(resultData);

         return resultBitmap;
}
于 2013-07-20T22:54:44.867 に答える