Разница между Image.Save и FileStream.Write () в c # - PullRequest
1 голос
/ 07 февраля 2012

Мне нужно прочитать двоичный образ из базы данных и сохранить этот двоичный образ как образ Tiff в файловой системе.Я использовал следующий код

private static bool SavePatientChartImageFileStream(byte[] ImageBytes, string ImageFilePath, string IMAGE_NAME)
    {
        bool success = false;
        try
        {
            using (FileStream str = new FileStream(Path.Combine(ImageFilePath, IMAGE_NAME), FileMode.Create))
            {
                str.Write(ImageBytes, 0, Convert.ToInt32(ImageBytes.Length));
                success = true;

            }
        }
        catch (Exception ex)
        {

            success = false;
        }
        return success;
    }

Поскольку эти двоичные файлы изображений передаются посредством репликации слиянием, иногда случается, что двоичный файл изображения передается не полностью, и мы отправляем запрос на выборку двоичного изображения с подсказкой nolock.Это возвращает в ImageBytes, имеющем 1-байтовые данные, и сохраняет его как испорченное изображение размером 0 КБ.

Я изменил приведенный выше код на: -

private static bool SavePatientChartImage(byte[] ImageBytes, string ImageFilePath, string IMAGE_NAME)
    {
        bool success = false;
        System.Drawing.Image newImage;
        try
        {
            using (MemoryStream stream = new MemoryStream(ImageBytes))
            {
                using (newImage = System.Drawing.Image.FromStream(stream))
                {
                    newImage.Save(Path.Combine(ImageFilePath, IMAGE_NAME));
                    success = true;
                }
            }
        }
        catch (Exception ex)
        {
            success = false;
        }
        return success;
    }

В этом случае, если ImageBytes1 байт или неполный, он не сохранит изображение и вернет успех как ложное.

Я не могу удалить NOLOCK, так как у нас экстремальная блокировка.

Второй код медленнее по сравнению спервый.Я пробовал на 500 изображений.разница составляла 5 секунд.

Я не мог понять разницу между этими двумя частями кода и тем, какой код использовать, когда.Пожалуйста, помогите мне понять.

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

В первой версии кода вы берете кучу байтов и записываете их в файловую систему. Там нет проверки действительного файла TIFF, потому что код не знает и не заботится, что это файл TIFF. Это просто набор байтов без какой-либо бизнес-логики.

Во втором коде вы берете байты, оборачиваете их в MemoryStream и затем передаете их в объект Image, который анализирует весь файл и считывает его как файл TIFF. Это дает вам необходимую проверку - она ​​может определить, когда данные недействительны, - но вы, по сути, дважды просматриваете весь файл, один раз, чтобы прочитать его (с дополнительными накладными расходами для анализа), и один раз, чтобы записать его на диск.

Предполагая, что вам не нужна проверка, требующая глубокого анализа файла изображения (количество цветов, размеры изображения и т. Д.), Вы можете пропустить это, просто проверив, имеет ли byte[] ImageBytes длину 1 (или найти какой-либо другой хороший индикатор поврежденных данных) и пропустите запись, если она не совпадает. По сути, сделайте свою собственную проверку, а не используйте класс Image в качестве средства проверки.

0 голосов
/ 07 февраля 2012

Я думаю, что основное различие между ними состоит в том, что во втором коде вы сначала записываете исходный байт [] в объект MemoryStream, что будет означать, что если данные станут по существу независимыми от базы данных.Таким образом, вы можете потенциально включить этот MemoryStream в первый код для достижения тех же результатов.

...