C # Bitmap Изменить цвет пикселя, выполнив XOR - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь изменить цвет RGB, используя XOR RGB.
пример:
=> если значение R для некоторого пикселя равно 5 = 101
// Цвет pcolor = image.GetPixel (j, k);

=> затем выполняем XOR с некоторым байтом 101 ^ 11111111 = 11111010
// R [x, w] = (байт) (R [x, w] ^ mykey [0]);

=> и заменить R на результат R = 11111010 = 250
//image.SetPixel(y, z, Color.FromArgb (A [y, z], R [y, z], G [y, z], B [y, z]));

но проблема в том, что если я снова прочитал этот результирующий кадр, то значение R, которое я изменил ранее, не равно 250.

using Accord.Video.FFMPEG;

VideoFileReader reader = new VideoFileReader();
reader.Open(@"E:\Video\Sample.MP4");
VideoFileWriter writer = new VideoFileWriter();
writer.Open(@"E:\Video\Result.MP4", reader.Width, reader.Height, reader.FrameRate, VideoCodec.MPEG4);
MyFunc(reader, writer)

public static void Myfunc(VideoFileReader reader, VideoFileWriter writer)
    {
    byte[] mykey = { 0xff, 0x55, 0x00 };
    Bitmap image = new Bitmap(reader.Width, reader.Height, PixelFormat.Format24bppRgb);
    for (int i = 0; i<reader.FrameCount; i++)
    {
        Bitmap videoFrame = reader.ReadVideoFrame();
        image = videoFrame;
        byte[,] A = new byte[reader.Width, reader.Height];
        byte[,] R = new byte[reader.Width, reader.Height];
        byte[,] G = new byte[reader.Width, reader.Height];
        byte[,] B = new byte[reader.Width, reader.Height];
        for (int j = 0; j<reader.Width; j++)
        {
            for (int k = 0; k<reader.Height; k++)
            {
                Color pcolor = image.GetPixel(j, k);
                A[j, k] = pcolor.A;
                R[j, k] = pcolor.R;
                G[j, k] = pcolor.G;
                B[j, k] = pcolor.B;
            }
        }

        for (int x = 0; x<reader.Width; x++)
        {
            for (int w = 0; w<reader.Height; w++)
            {
                R[x, w] = (byte) (R[x, w] ^ mykey[0]);
                G[x, w] = (byte) (G[x, w] ^ mykey[0]);
                B[x, w] = (byte) (B[x, w] ^ mykey[0]);
           }
        }

        for (int y = 0; y<reader.Width; y++)
        {
            for (int z = 0; z<reader.Height; z++)
            {
                image.SetPixel(y, z, Color.FromArgb(A[y, z], R[y, z], G[y, z], B[y, z]));
            }
        }

        writer.WriteVideoFrame(image);
        videoFrame.Dispose();
    }
}
...