C#位图无法保存原样

3

大家好,我正在我的大学做一个基本的隐写术项目。我操纵我的位图,但是在某个地方有一个错误。我设置了断点来检查 .save() 方法之前的值,像素看起来很好,但当我保存并打开新图像时,一些像素与预期的不同,可能会出现 +-1 个比特。以下是代码:

public class EncryptController
{
    public void EncryptMessage(Bitmap oldImage,string imagePath, DataSteg dataSteg)
    {
        Bitmap newImage = new Bitmap(oldImage.Width, oldImage.Height);
        ImageFormat imageFormat = ImageCheck.GetFormat(oldImage);
        string data = dataSteg.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"
                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 Color ChangeMaxRate(Color 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--;
        }

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

    private int CheckPixelVale(Color color)
    {
        return (color.R + color.B + color.G) % 2;
    }
}

1
"所有像素都是-1位,而不是预期的值..." - 呃?" - user585968
如果当前的data[index]是"1",我希望总和为奇数;如果是"0",则希望总和为偶数。因此,我检查RGB的总和,如果有差异,则将RGB的最大值加1,这样总和就会从奇数变成偶数,反之亦然。这个方法是有效的,但保存时会出现问题。 - Ivan Kaloyanov
2
使用JPG会让事情变得非常非常困难。采用如Rich所建议的PNG格式,可以采取更为简单明了的方式! - TaW
“-1”不就是“FFFFFFFF”吗,也就是完全不透明的白色? - Nyerguds
1个回答

5
我怀疑问题可能是您使用的文件类型。它可能是一个欺骗行为,但代码中的文件名是JPG,这是一种“有损”格式。图像对人眼来说看起来是相同的,但可能不包含您保存的确切位。尝试使用PNG图像格式。
通过传递“字符串数据”,而不是“DataSteg k”,您可以更好地分离关注点。这将使其更接近于MCVE。没有必要通过引用传递第一个参数。我建议该方法不应处理给定的参数。此外,除非我漏掉了什么,否则未使用字符串t。

谢了,我已经解决了。JPG格式有问题。我想要操作这个数据隐写术中的数据,所以我用它。是的,那只是测试。xaxa :) - Ivan Kaloyanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接