2016-05-08 11 views
1

Image Cropping with resizing using vb.netのチュートリアルに従っています。すべてうまく動作しますが、代わりにハードディスクに を保存してください。私は自分のデータベース(SQLServer)に保存したい。画像をトリミングしてvb.netを使用してデータベースに保存します

これは、私はそれがちょうどこの

Using cmd As New SqlClient.SqlCommand("dbo.uspAdd", cn) 
     cmd.CommandType = CommandType.StoredProcedure 
     cmd.Parameters.Add("@firstname", SqlDbType.VarChar, 100).Value = txtName.Text 
     cmd.Parameters.Add("@lastName", SqlDbType.VarChar, 100).Value = txtSurname.Text 
     'add insert picture code here 
     cmd.ExecuteNonQuery() 
     MsgBox("Save Record New record Successfully") 
    End Using 
のように一緒に私の二つのデータをSQL Server 2008の(画像データ型)に画像を保存するディスク上の

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cropSaveBtn.Click 
     Dim tempFileName As String 
     Dim svdlg As New SaveFileDialog() 
     svdlg.Filter = "JPEG files (*.jpg)|*.jpg|All files (*.*)|*.*" 
     svdlg.FilterIndex = 1 
     svdlg.RestoreDirectory = True 
     If svdlg.ShowDialog() = Windows.Forms.DialogResult.OK Then 
      tempFileName = svdlg.FileName   'check the file exist else save the cropped image 
      Try 
       Dim img As Image = PreviewPictureBox.Image 

       SavePhoto(img, tempFileName, 225) 
      Catch exc As Exception 
       MsgBox("Error on Saving: " & exc.Message) 
      End Try 
     End If 
    End Sub 

    Public Function SavePhoto(ByVal src As Image, ByVal dest As String, ByVal w As Integer) As Boolean 
     Try 
      Dim imgTmp As System.Drawing.Image 
      Dim imgFoto As System.Drawing.Bitmap 

      imgTmp = src 
      imgFoto = New System.Drawing.Bitmap(w, 225) 
      Dim recDest As New Rectangle(0, 0, w, imgFoto.Height) 
      Dim gphCrop As Graphics = Graphics.FromImage(imgFoto) 
      gphCrop.SmoothingMode = SmoothingMode.HighQuality 
      gphCrop.CompositingQuality = CompositingQuality.HighQuality 
      gphCrop.InterpolationMode = InterpolationMode.High 

      gphCrop.DrawImage(imgTmp, recDest, 0, 0, imgTmp.Width, imgTmp.Height, GraphicsUnit.Pixel) 

      Dim myEncoder As System.Drawing.Imaging.Encoder 
      Dim myEncoderParameter As System.Drawing.Imaging.EncoderParameter 
      Dim myEncoderParameters As System.Drawing.Imaging.EncoderParameters 

      Dim arrayICI() As System.Drawing.Imaging.ImageCodecInfo = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders() 
      Dim jpegICI As System.Drawing.Imaging.ImageCodecInfo = Nothing 
      Dim x As Integer = 0 
      For x = 0 To arrayICI.Length - 1 
       If (arrayICI(x).FormatDescription.Equals("JPEG")) Then 
        jpegICI = arrayICI(x) 
        Exit For 
       End If 
      Next 
      myEncoder = System.Drawing.Imaging.Encoder.Quality 
      myEncoderParameters = New System.Drawing.Imaging.EncoderParameters(1) 
      myEncoderParameter = New System.Drawing.Imaging.EncoderParameter(myEncoder, 60L) 
      myEncoderParameters.Param(0) = myEncoderParameter 
      imgFoto.Save(dest, jpegICI, myEncoderParameters) 
      imgFoto.Dispose() 
      imgTmp.Dispose() 

     Catch ex As Exception 

     End Try 
    End Function 

を保存するコードです

そして、私はこの問題を解決する方法を見つけるためにほぼ8時間立ち往生しています。どんな助けも非常に高く評価されるでしょう。

+0

おそらくこれが役に立ちます。 http://stackoverflow.com/questions/16842065/how-to-save-and-retrive-picturebox-image-to-sql-server-database-varbinarymax-cまたはbase64に変換して戻ることができますか? – Lectere

+0

@Lectere私のコードに沿ってそれを使用するのを手伝ってもらえますか? –

+0

まず、画像データを保存するのではなく**画像ファイルへのパスを考えてみましょう。[画像データ型は古くから廃止されました](https://msdn.microsoft.com/en-us/library/ms187993)。 aspx)ので、代わりにバイト配列を使用してVarBinaryを使用する必要があります。 B64文字列として保存しないでください。必要以上に大きくなります。また、空のキャッチブロックを使用することは非常に悪い考えです。 – Plutonix

答えて

0

イメージをBase64に変換して文字列として保存することをお勧めします。あなたが戻って画像を取得したいとき

は、その後、あなたは画像に戻ってBase64でから、それを変換する必要があります。

あなたはこのコードを使用してBase64でに画像を変換することができます:

Public Function ConvertImageToBase64(ByRef img As Image, ByVal format As System.Drawing.Imaging.ImageFormat) As String 
     Dim ImgStream As MemoryStream = New MemoryStream() 
     img.Save(ImgStream, format) 
     ImgStream.Close() 
     Dim ByteArray() As Byte = ImgStream.ToArray() 
     ImgStream.Dispose() 
     Return Convert.ToBase64String(ByteArray) 
    End Function 

http://www.dailycoding.com/posts/convert_image_to_base64_string_and_base64_string_to_image.aspx

とバックあなたはこのコードを使用することができる画像に変換する:

Public Function ConvertBase64ToImage(ByVal base64 As String) As Image 
     Dim img As System.Drawing.Image 
     Dim MS As System.IO.MemoryStream = New System.IO.MemoryStream 
     Dim b64 As String = base64.Replace(" ", "+") 
     Dim b() As Byte 
     b = Convert.FromBase64String(b64) 
     MS = New System.IO.MemoryStream(b) 
     img = System.Drawing.Image.FromStream(MS) 
     Return img 
    End Function 

を(http://snipplr.com/view/27514/vbnet-base64-to-image/

今、あなたはbasicalすることができます画像を文字列として次のように追加します。

Dim Base64Bitmap As String = ConvertImageToBase64(img, System.Drawing.Imaging.ImageFormat.Png) 
cmd.Parameters.Add("@Image", SqlDbType.VarChar, Base64Bitmap.Length).Value = Base64Bitmap 
+0

、ありがとうございます。私は上記のコードを試したとき、私は '' img 'が宣言されていないと言って '' Dim Base64Bitmap As String = ConvertImageToBase64(img、System.Drawing.Imaging.ImageFormat.Png)という行にエラーがあります。保護レベルのためにアクセスできない可能性があります。 –

+0

画像オブジェクトを「src」または「imgTmp」と宣言したように、画像を「img」と宣言しましたか? "src"を使うか、imgの代わりに使ってみてください。 –

関連する問題