2017-10-20 13 views
0

私はWPFプログラミングとMicrosoft SQLサーバーが初めてです。私は、データベースに画像を挿入したり、データベースから画像を取得したりしたいと考えています。画像(Windows.Controls.Image)をbyte[]に変換してデータベースに保存することを学びましたが、byte[]からImageに戻ってWPFウィンドウに表示できませんでした。C#からデータベースへのイメージの挿入と取り出しは?

private Image byteArrayToImage(byte[] arr) 
{ 
    MemoryStream stream = new MemoryStream(); 
    stream.Write(arr, 0, arr.Length); 
    stream.Position = 0; 
    System.Drawing.Image img = System.Drawing.Image.FromStream(stream); // Exception 
    BitmapImage returnImage = new BitmapImage(); 
    returnImage.BeginInit(); 
    MemoryStream ms = new MemoryStream(); 
    img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); 
    ms.Seek(0, SeekOrigin.Begin); 
    returnImage.StreamSource = ms; 
    returnImage.EndInit(); 
    Image ans = new Image(); 
    ans.Source = returnImage; 
    return ans; 
} 

出力:

System.ArgumentExceptionの: 'パラメータが有効ではありません'

private byte[] imageToArray(System.Drawing.Image img) // Work well 
{ 
    MemoryStream ms = new MemoryStream(); 
    FileInfo fi = new FileInfo(tempData); // File name 
    img.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
    byte[] pic = ms.ToArray(); 
    return pic; 
} 
+0

あなたの質問のタイトルを編集しました。質問のタイトルにタグを適用しないでください。なぜ[ここ](https://stackoverflow.com/help/tagging)を読んでください。 – dymanoid

+0

これを試しましたか? https://stackoverflow.com/questions/9564174/convert-byte-array-to-image-in-wpf – mm8

+0

または[this](https://stackoverflow.com/a/39366641/2029607) – XAMlMAX

答えて

-2

System.Drawing.Image.FromStreamこの例外が発生したときを示しています。

ストリームに有効な画像フォーマットがありません - または - ストリームがnullです。

場合によっては、APIドキュメントが以下を支援します。o)nullをチェックし、投稿/取得されたファイル形式を確認します。

downvoteによる詳細化: 画像フォーマットはバイト互換ではありません.btearにbtearを入れてデータベースに保存し、後でそれを取得する場合はbmpも取得する必要があります。 PNGは動作しません - それは完全に異なって保存されます。

+0

downvoterではなく、System.Drawingが厄介な 'WinForms'と栄光のある' WPF'で使われているために行われました。 – XAMlMAX

+0

スレッドポストに伝えてください - 彼はそれを使って何が間違っているのかを尋ねました。私は彼に、正確に何が間違っているかを示すAPIを指摘しました。 –

+0

実際にOPは 'Windows.Controls.Image'を参照しています。 – XAMlMAX

-1

まず、PictureHelper用の静的クラスを作成します。あなたがWPFで使用されているのBitmapImageをインポートする必要があり、私が考えるその、これは画像をアップロードするためのものです、これは絵

public SortableBindingList<Candidate> RetrieveManyWithPicture(Candidate entity) 
{ 
    var command = new SqlCommand { CommandText = "RetrievePictureCandidates", CommandType = CommandType.StoredProcedure }; 

    command.Parameters.AddWithValue("@CandidateId", entity.CandidateId).Direction = ParameterDirection.Input; 


    DataTable dt = SqlHelper.GetData(command); //this is where I retrieve the row from db, you have your own code for retrieving, so make sure it works. 

    var items = new SortableBindingList<Candidate>(); 

    if (dt.Rows.Count <= 0) return items; 
    foreach (DataRow row in dt.Rows) 
    { 
     Candidate item = new Candidate(); 

     item.CandidateId = row["CandidateId"].GetInt(); 
     item.LastName = row["LastName"].GetString(); 
     item.FirstName = row["FirstName"].GetString(); 

     item.PictureId = row["PictureId"].GetInt(); 
     item.PhotoType = PictureHelper.GetImage(row["Photo"]); //in my db, this is varbinary. in c#, this is byte[] 

     items.Add(item); 

    } 

    return items; 
} 

で(私の場合、候補者の)クラスを取得するためであるusing System.Drawing.Imaging;

using System; 
using System.Drawing; 
using System.Drawing.Drawing2D; 
using System.Drawing.Imaging; 
using System.IO; 
using System.Windows; 
using System.Windows.Forms; 
using System.Windows.Threading; 
using Application = System.Windows.Forms.Application; 
using Size = System.Drawing.Size; 

public static class PictureHelper 
{ 
    public static BitmapImage GetImage(object obj) 
    { 
     try 
     { 
      if (obj == null || string.IsNullOrEmpty(obj.ToString())) return new BitmapImage(); 

      #region Picture 

      byte[] data = (byte[])obj; 

      MemoryStream strm = new MemoryStream(); 

      strm.Write(data, 0, data.Length); 

      strm.Position = 0; 

      Image img = Image.FromStream(strm); 

      BitmapImage bi = new BitmapImage(); 

      bi.BeginInit(); 

      MemoryStream ms = new MemoryStream(); 

      img.Save(ms, ImageFormat.Bmp); 

      ms.Seek(0, SeekOrigin.Begin); 

      bi.StreamSource = ms; 

      bi.EndInit(); 

      return bi; 

      #endregion 
     } 
     catch 
     { 
      return new BitmapImage(); 
     } 
    } 

    public static string PathReturner(ref string name) 
     { 
      string filepath = ""; 
      OpenFileDialog openFileDialog = new OpenFileDialog(); 

      openFileDialog.Multiselect = false; 
      openFileDialog.Filter = @"Image Files(*.jpeg;*.bmp;*.png;*.jpg)|*.jpeg;*.bmp;*.gif;*.png;*.jpg"; 
      openFileDialog.RestoreDirectory = true; 
      openFileDialog.Title = @"Please select an image file to upload."; 

      MiniWindow miniWindow = new MiniWindow(); 
      miniWindow.Show(); 

      if (openFileDialog.ShowDialog() == DialogResult.OK) 
      { 
       filepath = openFileDialog.FileName; 
       name = openFileDialog.SafeFileName; 
      } 

      miniWindow.Close(); 
      miniWindow.Dispose(); 
      return filepath; 
     } 

     public static string Encryptor(this string safeName) 
     { 
      string extension = Path.GetExtension(safeName); 

      string newFileName = String.Format(@"{0}{1}{2}", Guid.NewGuid(), DateTime.Now.ToString("MMddyyyy(HHmmssfff)"), extension); 
      newFileName = newFileName.Replace("(", "").Replace(")", ""); 
      return newFileName; 
     } 


     public static Bitmap ByteToBitmap(this byte[] blob) 
     { 
      MemoryStream mStream = new MemoryStream(); 
      byte[] pData = blob; 
      mStream.Write(pData, 0, Convert.ToInt32(pData.Length)); 
      Bitmap bm = new Bitmap(mStream, false); 
      mStream.Dispose(); 
      return bm; 

     } 

     public static byte[] BitmapToByte(this Image img) 
     { 
      byte[] byteArray = new byte[0]; 
      using (MemoryStream stream = new MemoryStream()) 
      { 
       img.Save(stream, ImageFormat.Png); 
       stream.Close(); 

       byteArray = stream.ToArray(); 
      } 
      return byteArray; 
     } 
} 

私は私のボタンを使用DBへのWPFから

private void UploadButton_Click(object sender, EventArgs e) 
{ 
    string safeName = ""; 
    string pathName = PictureHelper.PathReturner(ref safeName); 
    PictureViewModel vm = new PictureViewModel(); 
    if (pathName != "") 
    { 
     safeName = safeName.Encryptor(); 

     FileStream fs = new FileStream(pathName, FileMode.Open, FileAccess.Read); 
     byte[] data = new byte[fs.Length]; 


     fs.Read(data, 0, Convert.ToInt32(fs.Length)); 
     fs.Close(); 

     PicNameLabel.Text = safeName; 
     vm.Entity.Name = safeName; //this is the byte[] 

     Bitmap toBeConverted = PictureHelper.ByteToBitmap(data); //convert the picture before sending to the db 

     vm.Entity.Photo = PictureHelper.BitmapToByte(toBeConverted); 
     vm.Entity.Path = pathName; 

     CandidatePictureBox.Image = toBeConverted; 

     vm.Insert(vm.Entity); 

    } 
} 

これは、画像を保存する方法である

public bool Insert(Picture entity) 
{ 
    var command = new SqlCommand(); 

    try 
    { 
     command.CommandText = "AddPicture"; 
     command.CommandType = CommandType.StoredProcedure; 

     command.Parameters.AddWithValue("@Name", entity.Name).Direction = ParameterDirection.Input; 
     command.Parameters.AddWithValue("@Photo", entity.Photo).Direction = ParameterDirection.Input; 

     int result = SqlHelper.ExecuteNonQuery(command); //executenonquery will save the params to the db 

     return true; 
    } 
    catch (Exception) 
    { 
     return false; 
    } 
} 
関連する問題