2015-03-15 4 views
0

У меня есть программа на C#, которая читает из файла JPG и записывает в мою базу данных SQL Server.C# Image.FromFile и Save on DB Разница в размере

Это мой кусок кода:

string cSQL = 
    "INSERT INTO xxx (ID, Image) " + 
    "VALUES (@ID, @Image) "; 

using (SqlConnection conn = new SqlConnection("xxx")) 
{ 
    Image image = Image.FromFile(string.Format(@"{0}\{1}.jpg", source, ID)); 

    SqlParameter[] parametros = new SqlParameter[] { 
     new SqlParameter("@ID", ID), 
     new SqlParameter("@Image", ImageToByteArray(img)) 
    }; 

    SqlCommand cmd = new SqlCommand(cSQL, conn); 
    conn.Open(); 
    cmd.Parameters.AddRange(parametros); 
    return cmd.ExecuteNonQuery() > 0; 
} 

public static byte[] ImageToByteArray(Image image) 
{ 
    if (image == null) return null; 

    MemoryStream mStream = new MemoryStream(); 
    image.Save(mStream, System.Drawing.Imaging.ImageFormat.Jpeg); 
    byte[] ret = mStream.ToArray(); 
    mStream.Close(); 
    return ret; 
} 

Этот код работает хорошо, но проблема в том, размер поля в моей базе данных.

Например, вот сравнительный из размера VARBINARY (максимум) в моем дб и размер в килобайтах из Jpeg изображений:

enter image description here

Как вы можете видеть, размер файл и размер моего поля varbinary (max) являются су-разными!

Я делаю что-то неправильно?

PS: Я использую функцию SQL Server DALENGTH (Image), чтобы получить размер поля.

ответ

3

Вы сохраняете декодированный Image на MemoryStream и сжимаете его обратно в JPEG, но, возможно, настройки качества отличаются от того, из чего они были первоначально сохранены. Что еще более важно, вы дважды сжимаете изображение; он не собирается хорошо сжиматься во второй раз. Это также снижает качество изображения.

Не читайте его сначала в Image. Это полная трата циклов, чтобы прочитать его, распаковать, а затем снова сжать (не говоря уже о потере качества). Просто прочитайте двоичный поток файла непосредственно в БД.

+0

Не могли бы вы привести пример того, как я изменил бы свой код? –

+0

Ну, вы уже делаете большую часть работы. Прочитайте файл в потоке и используйте «BinaryReader», чтобы вывести байты. Отправьте вывод в массив, и все готово. –

+0

благодарит за вашу помощь. Теперь он работает хорошо. Вот код, который я использовал: –

Смежные вопросы