1
    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問題が見つかりました。u right man.バイトをデータテーブルに保存すると、実際のバイトではなく値System.Byte []が保存されます..データテーブルのすべての値を取得してクエリに入れると、「テーブル値に挿入('System.Byte []'). バイナリ データではなく、文字列 System.Byte" を格納します。

4

1 に答える 1

2

すべてのデータを にロードしMemoryStream、ストリームを巻き戻しました。これで問題ありません (new MemoryStream(byteArrayIn)もっと簡単だったはずですが)。

これにより、1 つの単純な可能性が残ります。配列には、必要なすべてのデータが実際には含まれていません。

配列を取得した方法と、すべての中間ステップを確認してください。特に、デバッグ コードを追加して、配列を書き込むときに配列の長さを記録し、そのすべてを取得したことを確認します。長さが同じ場合は、内容がバイトごとに同一であることを確認します (Convert.ToBase64Stringアドホックな使用法では、出力を比較するのがおそらく最も便利な方法です)。

ストリームを書き込んでいる場合は、いくつかのことを確認してください。

  • Stream.Read/ループを使用しているStream.Write場合は、からの戻り値をRead正しく使用していることを確認してください。または簡単 - 代わりに使用してください (これには/ループStream.CopyToが正しく実装されています)ReadWrite
  • を使用MemoryStreamする場合は、 と の違いToArrayGetBuffer、それぞれの意味を理解していることを確認してください。
  • 任意の時点でデータを転送する場合は、常にバイナリとして処理していることを確認してください。テキストではありません。いいえStreamReader/ StreamWriter/ Encoding/ GetString/ そんなことはありません
于 2012-10-30T07:52:35.767 に答える