Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#位图don';我不能挽救现状_C#_.net_Bitmap - Fatal编程技术网

c#位图don';我不能挽救现状

c#位图don';我不能挽救现状,c#,.net,bitmap,C#,.net,Bitmap,嗨,伙计们,我在大学里做一个基本的隐写术项目。我操作了位图,但在某个地方有一个bug。我在.save()方法之前设置了一个断点只是为了检查值,像素看起来很好,但是当我保存它并打开新图像时,一些像素与预期值相差+-1位。代码如下: public class EncryptController { public void EncryptMessage(Bitmap oldImage,string imagePath, DataSteg dataSteg) { Bitm

嗨,伙计们,我在大学里做一个基本的隐写术项目。我操作了位图,但在某个地方有一个bug。我在.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;
    }
}
公共类加密控制器
{
public void EncryptMessage(位图oldImage、字符串imagePath、DataSteg DataSteg)
{
位图newImage=新位图(oldImage.Width、oldImage.Height);
ImageFormat ImageFormat=ImageCheck.GetFormat(旧图像);
string data=dataSteg.EncryptData();
int keyLength=data.Length;
int-bitmapPos=0;
对于(int i=0,n=oldImage.Size.Width;i0)
{
Color newColor=ChangeMaxRate(oldImage.GetPixel(i,j));
设置像素(i,j,newColor);
}
其他的
{
Color newColor=oldImage.GetPixel(i,j);
设置像素(i,j,newColor);
}
if(位图位置<数据长度-1)
{
键长--;
bitmapPos++;
}
}
}  
字符串pt=Environment.GetFolderPath(Environment.SpecialFolder.Desktop)+@“\fl\roseEnc.jpg”;
Dispose();
newImage.Save(pt,imageFormat);
}
专用颜色更改最大速率(颜色)
{
int red=color.R;
int蓝色=颜色B;
int绿色=颜色.G;
如果(红色+蓝色+绿色<255*3)
{
如果((红色>=蓝色和红色>=绿色)和&red=红色和蓝色>=绿色)和蓝色<255)
{
蓝色++;
}
否则((绿色>=蓝色和绿色>=红色)和绿色<255)
{
绿色++;
}
}
其他的
{
红色--;
}
返回颜色。来自argb(红色、绿色、蓝色);
}
私有整数检查像素值(彩色)
{
返回(color.R+color.B+color.G)%2;
}
}

我怀疑问题可能是您使用的文件类型。这可能是个骗局,但代码中的文件名是JPG,这是一种“有损”格式。图像在人看来是一样的,但可能不包含您保存的确切位。尝试使用PNG图像格式


通过传递“stringdata”而不是“datastegk”,可以更好地分离关注点。这将使它更接近于MCVE。不需要通过ref传递第一个参数。我认为,对于这个方法来说,处理给定的参数是一个糟糕的设计。此外,除非我遗漏了一些未使用的字符串。

“…所有像素都是预期的-1位不稳定…”嗯?是的,如果当前数据[索引]为“1”,即使是“0”,我希望总和为奇数所以我检查RGB的和,如果有差异,加1到RGB的最大值,这样它的和从奇数到偶数再向后。它可以工作,但是当我保存它的时候会有尊重。使用jpg会让它变得非常困难。按照Rich的建议,使用如此简单的方法,您需要使用png!“-1”不就是“FFFFFFFF”,又名,完全不透明的白色吗?Tnx我修复了它。JPG格式是问题所在。我想操作这个数据集中的数据,这就是我使用它的原因。是的,这只是为了测试。xaxa:)