2016-09-21 4 views
0

Привет Я пытаюсь сохранить измененное изображение из Picturebox в базу данных. У меня есть этот код:Ошибка при сохранении измененного размера изображения в базе данных

Dim Obrazek As Image 
    If OpenFileDialog1.ShowDialog = DialogResult.OK Then 

     PictureBox1.Image = Image.FromFile(OpenFileDialog1.FileName) 

     '516, 387 
     Dim NewSize As New Size(773, 580) 
     ResizeImage = New Bitmap(PictureBox1.Image, NewSize) 
     PictureBox1.Image = ResizeImage 
     Obrazek = ResizeImage 


    End If 



    Dim ImageIDShop As String = "0000" 
    'Get Image Via Memory stream 
    Dim img As Image = Obrazek 
    Dim ms As New MemoryStream 
    img.Save(ms, img.RawFormat) 
    Dim buffer As Byte() = ms.GetBuffer 

    'Add SQL Parameters 
    SQL.AddParam("@ImageIDShop", ImageIDShop) 
    SQL.AddParam("@imageString", buffer) 

    SQL.QueryArcades("INSERT INTO [dbo].[ImageTable] 
           ([ImageIDShop] 
           ,[ImageString]) 
         VALUES 
           (@ImageIDShop 
           ,@imageString) ") 

    ResizeImage.Dispose() 

    MsgBox("Saved") 

Обе части отдельной работы гранд, но вместе у меня есть ошибка:

Необработанное исключение типа «System.ArgumentNullException» произошло в System.Drawing.dll

Дополнительная информация : Значение не может быть нулевым.

в линии:

img.Save(ms, img.RawFormat) 

Я стараюсь сохранить изменения размера изображений из окна Изображения на диск, а затем отправить его в базу данных, но у меня есть другая ошибка. Я могу сохранить файл, используя saveopendialog но я не могу с помощью простого кода:

ResizeImage.Save("ImageName.jpg", System.Drawing.Imaging.ImageFormat.Jpeg) 

Это будет здорово, если кто-нибудь может сказать мне, что я делаю неправильно.

+0

В сообщении об ошибке сообщается, что некоторая ссылка имеет значение null и не допускается. Вы - тот, у кого есть действующий код перед вами. Проверьте, какая ссылка имеет значение null. – jmcilhinney

+0

Сказано, что «img» имеет значение null, но я не знаю почему. – Hateusz

+0

У вас много чего происходит в этом коде. 'ResizeImage' будет пустой растровой картиной - предполагается ли это изменение размера выбранного изображения? – Plutonix

ответ

2

Вы очень много происходит на этом маленьком кусочке кода:

  1. взаимодействовать с пользователем, чтобы выбрать изображение файла
  2. Измените размер (код оленья кожа на самом деле сделать это, но (?) выглядит как предполагается)
  3. Преобразовать изображение в Byte()
  4. Сохранить в базе данных

Я бы выполнить каждый шаг через индивидуальный метод. У вас также есть несколько переменных, ссылающихся на одно и то же: Obrazek, img, PictureBox1.Image и ResizeImage все относятся к одному и тому же объекту изображения. Если вы хотите показать исходное или измененное изображение в PictureBox, вы также не можете удалить его. Вероятно, вы получите большой красный X.

' 1: get selected image form user 
If OpenFileDialog1.ShowDialog <> DialogResult.OK Then Return 

Dim imgData As Byte() 
Using selectedImg As Image = Image.FromFile(OpenFileDialog1.FileName) 

    Using imgThumb As New Bitmap(selectedImg.Width \ 2, selectedImg.Height \ 2), 
     g = Graphics.FromImage(imgThumb) 

     ' 2: create resized image 
     g.DrawImage(selectedImg, 0, 0, imgThumb.Width, imgThumb.Height) 
     ' cannot use a Disposed image 
     'pBox.Image = imgThumb 

     ' 3: convert to byte() 
     Using ms As New MemoryStream() 
      imgThumb.Save(ms, ImageFormat.Jpeg) 
      ' Do NOT use getbuffer! 
      imgData = ms.ToArray() 
     End Using 

    End Using 
End Using 

Dim ImageIDShop As String = "0000" 

' 4: save to DB 
Using dbCon As New MySqlConnection(MySQLConnStr), 
    cmd As New MySqlCommand("INSERT INTO BlobDemo (itemName, itemType, imgData) VALUES (@p1, @p2, @p3)", dbCon) 

    cmd.Parameters.Add("@p1", MySqlDbType.String).Value = ImageIDShop 
    cmd.Parameters.Add("@p2", MySqlDbType.String).Value = "jpg" 
    cmd.Parameters.Add("@p3", MySqlDbType.Blob).Value = imgData 

    dbCon.Open() 
    cmd.ExecuteNonQuery() 
End Using 

Примечания

  • Это создает уменьшенное изображение половину ширины и высоты оригинала. Вы можете проверить, если оригинал даже должен быть изменен
  • Код реализует using блоков распоряжаться из тех вещей, которые должны быть расположены
  • Если вы хотите сохранить либо оригинал или изменено один, удалить его из Using блок
  • Не используйте GetBuffer() - как указано в MSDN, это может привести к тому, что массив байтов намного больше, чем нужно, и раздувает DB.
  • Вы, вероятно, хотите, чтобы на самом деле кодировать в результате изменения размера изображения, а не сохранение RawFormat
  • Я понятия не имею, что SQL.AddParam есть - это выглядит как какой-то БД «помощника». Учитывая параметры, он почти должен использовать AddWithValue с не рекомендуется. Существует не так много, что ему нужен помощник.
Смежные вопросы