【问题标题】:End of Stream Parsing Error流解析错误结束
【发布时间】:2012-10-31 09:52:30
【问题描述】:
    public static Image Crop(Image imgPhoto, int Width, int Height, AnchorPosition Anchor)
        {
            if (imgPhoto == null)
            {
                return null;
            }
            int sourceWidth = imgPhoto.Width;
            int sourceHeight = imgPhoto.Height;
            int sourceX = 0;
            int sourceY = 0;
            int destX = 0;
            int destY = 0;

            float nPercent = 0;
            float nPercentW = 0;
            float nPercentH = 0;

            nPercentW = ((float)Width / (float)sourceWidth);
            nPercentH = ((float)Height / (float)sourceHeight);

            if (nPercentH < nPercentW)
            {
                nPercent = nPercentW;
                switch (Anchor)
                {
                    case AnchorPosition.Top:
                        destY = 0;
                        break;
                    case AnchorPosition.Bottom:
                        destY = (int)(Height - (sourceHeight * nPercent));
                        break;
                    default:
                        destY = (int)((Height - (sourceHeight * nPercent)) / 2);
                        break;
                }
            }
            else
            {
                nPercent = nPercentH;
                switch (Anchor)
                {
                    case AnchorPosition.Left:
                        destX = 0;
                        break;
                    case AnchorPosition.Right:
                        destX = (int)(Width - (sourceWidth * nPercent));
                        break;
                    default:
                        destX = (int)((Width - (sourceWidth * nPercent)) / 2);
                        break;
                }
            }

            int destWidth = (int)(sourceWidth * nPercent);
            int destHeight = (int)(sourceHeight * nPercent);

            Bitmap bmPhoto = new Bitmap(Width, Height, PixelFormat.Format24bppRgb);
            bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);

            Graphics grPhoto = Graphics.FromImage(bmPhoto);
            grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;

            grPhoto.DrawImage(imgPhoto,
                new Rectangle(destX, destY, destWidth, destHeight),
                new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight),
                GraphicsUnit.Pixel);

            grPhoto.Dispose();
            return bmPhoto;
        }


     public byte[] ImageToByteArray(string path)
        {
            FileInfo info = new FileInfo(path);
            long sizeByte = info.Length;

            FileStream fs = new FileStream(path,FileMode.Open,FileAccess.Read);

            BinaryReader br = new BinaryReader(fs);

            byte[] data = br.ReadBytes((int) sizeByte);
            return  data;
        }


        public byte[] ImageToByteArray(Image img)
        {

            if (img == null)
                return null;

            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();
            bf.Serialize(ms, img);
            return ms.ToArray();

        }

    public Image BrowseImage(Image image)
        {
            OpenFileDialog open = new OpenFileDialog();
            open.FileName = string.Empty;

            open.Filter = "Image Files(*.png; *.jpg; *.jpeg; *.gif; *.bmp)|*.png; *.jpg;    *.jpeg; *.gif; *.bmp";
            if (open.ShowDialog() == DialogResult.OK)
            {
                Image img = new Bitmap(open.FileName);
                if ((img.Width < 200) || (img.Height < 200))
                {
                    MessageBox.Show("Minimum size is 200x200.");
                    BrowseImage(image);
                }
                else
                {
                    return img;
                }
            }
            return image;
        }


in saving image

     picItem.Image = Crop(BrowseImage(picItem.Image), 200, 200, ImageUtil.AnchorPosition.Center);



 //set Datatable row
    erow["Image"] = img.ImageToByteArray(picItem.Image);


 //Saving is ok

    //When i View
    picItem.Image = ByteArrayToImage((byte[])source.Image.binaryFromDB);


>Error: End of Stream encountered before parsing was completed?

这是我使用的所有方法。我裁剪图像,使其具有最小尺寸。我尝试了任何转换但没有帮助。 我只想将图像保存到数据库,当我查看时,我可以在图片框中看到图像。

@MarcGravell 我发现了问题。你是对的。当我将字节存储在数据表中时,它存储一个值 System.Byte [] 而不是实际字节。当我获取数据表中的所有值并将其放入查询“插入表值('System.Byte []'). .它存储一个字符串 System.Byte" 而不是二进制数据..

【问题讨论】:

  • 什么是byteArrayIn?怎么填的?
  • 您确定byteArrayIn 包含所有数据吗?
  • byteArrayIn 是字节数组吗??
  • byteArrayIn 是存储在数据库中的图像的二进制数据..我想从数据库中获取数据并将其显示在图片框中。我用它来将图像转换为 byte[] public byte[] ImageToByteArray(Image img) { if (img == null) return null; BinaryFormatter bf = new BinaryFormatter();内存流毫秒 = 新的内存流(); bf.Serialize(ms, img);返回 ms.ToArray(); }
  • 如果它是System.Drawing.Image,那么使用image.Save(memoryStream, format)Image.FromStream(memoryStream) 会是一个很多更好的主意。除此之外:我所说的在你写的时候检查长度,然后和你拿回来的长度比较。

标签: c#


【解决方案1】:

您已将所有数据加载到 MemoryStream 并重新启动流 - 一切都很好(虽然 new MemoryStream(byteArrayIn) 会更容易)。

这留下了一种简单的可能性:数组确实没有包含它应该包含的所有数据。

检查您是如何获得数组的,以及所有中间步骤。特别是,添加一些调试代码来记录数组的长度当你写它时,并检查你是否得到了所有的。如果长度相同,请检查 contents 是否逐字节相同(比较 Convert.ToBase64String 的输出可能是临时使用最方便的方法)。

如果您正在编写流,请检查以下几点:

  • 如果使用Stream.Read/Stream.Write 循环,请检查您是否正确使用了Read 的返回值;或更简单 - 只需使用 Stream.CopyTo 代替(这有一个正确实现的 Read/Write 循环)
  • 如果使用MemoryStream,请确保您了解ToArrayGetBuffer 之间的区别以及各自的含义
  • 如果您在任何时候传输数据,请确保您始终将其视为二进制 - 绝不是文本。没有StreamReader / StreamWriter / Encoding / GetString / 类似的东西

【讨论】:

  • 我用它来转换二进制中的图像。 'BinaryFormatter bf = new BinaryFormatter();内存流毫秒 = 新的内存流(); bf.Serialize(ms, img);返回 ms.ToArray();'
  • @Snippet 对;那个ms.ToArray() 和这个反序列化代码之间的数组会发生什么?它去文件吗?到数据库?还有其他中间步骤吗?还是直接从序列化到反序列化?
  • 序列化后我将字节存储在数据表中,然后将数据表中的数据保存在数据库中。
  • @Snippet 然后我强烈怀疑这两点之间的某些东西。正如我所说:验证两点的内容。如果它们不相同,则您的存储代码已损坏。
  • 我也怀疑是我存储数据的时候datatable有问题。我的数据列的数据类型是 SqlBinary。对吗?
猜你喜欢
  • 2019-05-02
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多