c#位图不保存它的方式

Iva*_*nov 2 .net c# bitmap

嗨,大家好,我正在大学从事基本的隐写术项目.我操纵我的位图,但某处有一个错误.我设置一个断点只是为了检查.save()方法之前的值和像素看起来很好但是当我保存它并打开新图像时,一些像素是预期的+ -1位实例.这是代码:

public static class EncryptController
{
    public static void EncryptMessage(Bitmap oldImage,string imagePath, DataSteg k, string t)
    {
        Bitmap newImage = new Bitmap(oldImage.Width, oldImage.Height);
        ImageFormat imageFormat = ImageCheck.GetFormat(oldImage);
        string data = k.EncryptData();
        int keyLength = data.Length;
        int bitmapPos = 0;

        for (int i = 0, n = oldImage.Size.Width; i < n; i++)
        {
            for (int j = 0, z = oldImage.Size.Height; j < z; j++)
            {   //data = "010010110110000101101100011000110110100001101111"

                var tt = oldImage.GetPixel(i, j);
                if ((Convert.ToInt32(data[bitmapPos].ToString()) != CheckPixelVale(newImage.GetPixel(i, j)))&&keyLength>0)
                {
                    Color newColor = ChangeMaxRate(oldImage.GetPixel(i, j));
                    newImage.SetPixel(i, j, newColor);
                }
                else
                {
                    Color newColor = oldImage.GetPixel(i, j);
                    newImage.SetPixel(i, j, newColor);
                }

                if (bitmapPos < data.Length-1)
                {
                    keyLength--;
                    bitmapPos++;
                }
            }
        }  

        string pt = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\fl\roseEnc.jpg";
        oldImage.Dispose();
        newImage.Save(pt, imageFormat);
    }

    private static Color ChangeMaxRate(Color color)
    {
        Color result = color;

        int red = color.R;
        int blue = color.B;
        int green = color.G;

        if (red + blue + green < 255 * 3)
        {
            if ((red >= blue && red >= green) && red<255)
            {
                red++;
            }
            else if ((blue >= red && blue >= green) & blue < 255)
            {
                blue++;
            }
            else if ((green >= blue && green >= red) && green < 255)
            {
                green++;
            }
        }
        else
        {
            red--;
        }

        result = Color.FromArgb(red, green, blue);
        return result;
    }

    private static int CheckPixelVale(Color color)
    {
        return (color.R + color.B + color.G) % 2;
    }
Run Code Online (Sandbox Code Playgroud)

Ric*_*imo 5

我怀疑问题可能是您正在使用的文件类型.这可能是一种欺骗,但代码中的文件名是JPG,这是一种"有损"格式.图像看起来与人类相同,但可能不包含您保存的确切位.尝试使用PNG图像格式.

通过传入"字符串数据"而不是"DataSteg k",您可以更好地分离关注点.这将使它更接近成为MCVE.无需通过ref传递第一个参数.我建议这个方法的一个糟糕的设计是处理它已经给出的参数.此外,除非我错过了一些字符串t未使用.