С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/55: Рейтинг темы: голосов - 55, средняя оценка - 4.98
 Аватар для Zwelenewskiy
129 / 127 / 107
Регистрация: 09.01.2017
Сообщений: 1,651

Сохранение изображения

14.07.2018, 19:52. Показов 10438. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. На сервер передается изображение, сконвертированное в байтовый массив (ф-я расположена в другом классе):
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
public static byte[] ImageToByteArray(System.Drawing.Image img)
{
  using(var ms = new MemoryStream())
  {
     img.Save(ms, Form1.FormatTmp);
     return
              ms.ToArray();
   }
}


На сервере производится обратное преобразование:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
public static System.Drawing.Image ByteArrayToImage(byte[] img)
{
  using(var ms = new MemoryStream(img))
  {
    return System.Drawing.Image.FromStream(ms);
   }
}


Затем изображение сохраняется (UserReport - структура, частью которой является передаваемое изображение в массиве байтов):
C#
1
2
var image = Program.ByteArrayToImage(UserReport.Image);
image.Save("D:\\", image.RawFormat);
В итоге ошибка: В GDI+ возникла ошибка общего вида. И указывается именно на метод Save
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.07.2018, 19:52
Ответы с готовыми решениями:

Сохранение изображения
Всем привет , ищу уже часа 4 хороших . Подскажите как мне сохранить картинку из pictureBox , в выбранную папку , через openfiledialog не...

сохранение изображения
Доброго времени суток. На форме есть panel на котором picturebox , при загрузке в picturebox изображения превышающего размеры панела у...

Сохранение отредактированного изображения
Как правильно сохранить изображение? У меня при сохранении текст уходит влево. Почему так происходит? Вот код: bool...

13
 Аватар для Shogun31337
557 / 534 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
14.07.2018, 20:56
Цитата Сообщение от Zwelenewskiy Посмотреть сообщение
В итоге ошибка: В GDI+ возникла ошибка общего вида. И указывается именно на метод Save
А что за формат такой Form1.FormatTmp? Там, насколько мне помнится, должно быть значение типа ImageFormat. Попробуйте указать другой формат. Например ImageFormat.Bmp. Т.к. в остальном код, вроде рабочий.
0
 Аватар для Zwelenewskiy
129 / 127 / 107
Регистрация: 09.01.2017
Сообщений: 1,651
14.07.2018, 21:03  [ТС]
Shogun31337, это пропустил. FormatTmp - переменная, содержащая формат. Она в классе формы Form1. Сейчас уже просто попытался сохранить изображение из PictureBox:
C#
1
PictBox1.Image.Save("D:\\", PictBox1.Image.RawFormat);
Ошибка та же

Добавлено через 2 минуты
Текст ошибки:
System.Runtime.InteropServices.ExternalE xception (0x80004005): В GDI+ возникла ошибка общего вида.
в System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
в System.Drawing.Image.Save(String filename, ImageFormat format)
0
 Аватар для Shogun31337
557 / 534 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
14.07.2018, 21:17
Цитата Сообщение от Zwelenewskiy Посмотреть сообщение
Ошибка та же
Ну тут либо с файлом какие то проблемы, либо все таки с форматом. Сейчас у себя проверил, код рабочий:
0
 Аватар для Shogun31337
557 / 534 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
14.07.2018, 21:17
Т.е. в массив он преобразует, ошибок не вылезает
0
 Аватар для Zwelenewskiy
129 / 127 / 107
Регистрация: 09.01.2017
Сообщений: 1,651
14.07.2018, 21:23  [ТС]
Сделал и такой вариант:
C#
1
2
var img = Image.FromFile(@"D:\Alexander\test.bmp");
img.Save("D:\\", ImageFormat.Bmp);
Файл сделал вручную. Что с форматом может быть не так?)
0
 Аватар для Shogun31337
557 / 534 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
14.07.2018, 21:30
Лучший ответ Сообщение было отмечено Zwelenewskiy как решение

Решение

Цитата Сообщение от Zwelenewskiy Посмотреть сообщение
img.Save("D:\", ImageFormat.Bmp);
Имя файла у Вас не указано. Вы пытаетесь сохранить файл в директорию. Нужно так:
C#
1
img.Save("D:\\file.bmp", ImageFormat.Bmp);
0
 Аватар для Zwelenewskiy
129 / 127 / 107
Регистрация: 09.01.2017
Сообщений: 1,651
14.07.2018, 21:53  [ТС]
Shogun31337, мда. Слишком дурак =)) Спасибо =)

Добавлено через 17 минут
Я снова возвращаюсь)) Решил на всякий случай проверить работоспособность ф-й для конвертирования. При переводе картинки в байтовый массив уже знакомая о ошибка: В GDI+ возникла ошибка общего вида. А именно в этой строке:
C#
1
2
3
4
5
6
7
8
9
public static byte[] ImageToByteArray(Image img)
{
  using(var ms = new MemoryStream())
  {
     img.Save(ms, img.RawFormat);//здесь
     return
            ms.ToArray();
   }
}
Добавлено через 1 минуту
Shogun31337, как я понял, у Вас эта ф-я работала...
0
 Аватар для Shogun31337
557 / 534 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
14.07.2018, 21:56
Так у Вас опять указан какой то нестандартный формат:
Цитата Сообщение от Zwelenewskiy Посмотреть сообщение
img.RawFormat
Используйте класс ImageFormat для указания формата. Там есть доступные форматы, которые можно использовать. Другие скорее всего и будут причиной ошибок

Добавлено через 46 секунд
Цитата Сообщение от Zwelenewskiy Посмотреть сообщение
как я понял, у Вас эта ф-я работала...
Да. Только я формат указывал не экзотический, а из класса ImageFormat
0
 Аватар для Zwelenewskiy
129 / 127 / 107
Регистрация: 09.01.2017
Сообщений: 1,651
14.07.2018, 21:57  [ТС]
Shogun31337, RawFormat возвращает формат файла объекта - описание из коробки
0
 Аватар для Shogun31337
557 / 534 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
14.07.2018, 23:56
Хотя, у меня вариант с img.Save(ms, img.RawFormat); тоже сработал нормально. Значит с файлом что то... Попробуйте другой файл открыть

Добавлено через 1 час 56 минут
Zwelenewskiy, поигрался немного с Вашими функциями преобразования. Похоже, они как то неправильно работают. В некоторых файлах, при попытке сохранить преобразованную из массива картинку, выскакивает такое же исключение как и у Вас. В тех же файлах, где исключения нет, файл записывается криво и не имеет ничего общего с исходным файлом. Я в одном из своих проектов пользовался такими функциями:
Картинка в массив:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
        public static unsafe byte[,,] BitmapConvertToByteArray(Bitmap bmp)
        {
            int width = bmp.Width,
                height = bmp.Height;
            byte[,,] bytes = new byte[3, height, width];
            BitmapData bd = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly,
                PixelFormat.Format24bppRgb);
            try
            {
                byte* currentPosition;
                fixed (byte* startPointer = bytes)
                {
                    byte* red = startPointer;
                    byte* green = startPointer + width * height;
                    byte* blue = startPointer + 2 * width * height;
                    for (int h = 0; h < height; h++)
                    {
                        currentPosition = ((byte*)bd.Scan0) + h * bd.Stride;
                        for (int w = 0; w < width; w++)
                        {
                            *blue = *(currentPosition++);
                            ++blue;
                            *green = *(currentPosition++);
                            ++green;
                            *red = *(currentPosition++);
                            ++red;
                        }
                    }
                }
            }
            finally
            {
                bmp.UnlockBits(bd);
            }
            return bytes;
        }

Массив в картинку:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
        public static unsafe Bitmap ByteArrayConvertToBitmap(byte[,,] bytes)
        {
            int width = bytes.GetLength(2);
            int height = bytes.GetLength(1);
 
            Bitmap result = new Bitmap(width, height, PixelFormat.Format24bppRgb);
 
            BitmapData bd = result.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly,
                PixelFormat.Format24bppRgb);
 
            try
            {
                byte* currentPosition;
                fixed (byte* startPointer = bytes)
                {
                    byte* red = startPointer;
                    byte* green = startPointer + width * height;
                    byte* blue = startPointer + 2 * width * height;
                    for (int h = 0; h < height; h++)
                    {
                        currentPosition = ((byte*)bd.Scan0) + h * bd.Stride;
                        for (int w = 0; w < width; w++)
                        {
                            *(currentPosition++) = *blue;
                            ++blue;
                            *(currentPosition++) = *green;
                            ++green;
                            *(currentPosition++) = *red;
                            ++red;
                        }
                    }
                }
            }
            finally
            {
                result.UnlockBits(bd);
            }
 
            return result;
        }

Правда, там используется 3-х мерный массив. Мне нужен был именно такой. Но, возможно, и Вам такой вариант подойдет...
1
 Аватар для Zwelenewskiy
129 / 127 / 107
Регистрация: 09.01.2017
Сообщений: 1,651
15.07.2018, 00:41  [ТС]
Shogun31337, да, спасибо, попытаюсь в этом разобраться) Но нашел более простой способ:
C#
1
2
byte[] bData = File.ReadAllBytes(@"someFile.someExtention");
File.WriteAllBytes(@"sevedFile.someExtention", bData);
https://www.cyberforum.ru/post1614570.html Если что)
0
 Аватар для Shogun31337
557 / 534 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
15.07.2018, 09:51
Цитата Сообщение от Zwelenewskiy Посмотреть сообщение
Но нашел более простой способ:
В поисках решения часто забываем о самых простых вариантах!
0
 Аватар для Zwelenewskiy
129 / 127 / 107
Регистрация: 09.01.2017
Сообщений: 1,651
15.07.2018, 19:27  [ТС]
Все еще бьюсь с этой задачей) Создание изображения из массива байтов через поток(buffer - массив байтов, содержащий изображение):
C#
1
2
3
using(var ms = new MemoryStream(buffer)){
 PictBox1.Image = Image.FromStream(ms);
}
Но при обратной операции (перевод изображения в массив) уже набившая оскомину ошибка - ошибка общего вида в GDI+:
C#
1
2
3
4
byte[] buffer;
MemoryStream ms = new MemoryStream();    
PictBox1.Image.Save(ms, ImageFormat.Bmp);//ошибка здесь
buffer = ms.ToArray();
Программа упорно не хочет писать изображение в поток...

Добавлено через 4 минуты
Можно, конечно, сделать костыль с получением массива, последующим сохранением на диске, загрузкой в PictureBox) Но ведь это костыль)

Добавлено через 1 час 41 минуту
Проблема решена. Как я выяснил, дело было в том, что в PictureBox изображение грузилось некорректно:
C#
1
2
3
4
using (var fStream = new FileStream(OpenFileDialog.FileName, FileMode.Open))
{
  PictBox1.Image = Image.FromStream(fStream);
}
Грузил так, потому что в одной из статей рекомендовалось это делать именно так. Сейчас картинка загружается так(самым простым способом):
C#
1
PictBox1.Image = new Bitmap(OpenFileDialog.FileName);
Наконец-то, итог =))
1) Конвертирование изображения в байтовый массив:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
using(var ms = new MemoryStream())
{
  PictBox1.Image.Save(ms, PictBox1.Image.RawFormat);
  byte[] buffer =  ms.ToArray();
}


2) Конвертирование байтового массива в изображение:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
using(var ms = new MemoryStream(buffer))
{
  PictBox1.Image = Image.FromStream(ms);
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.07.2018, 19:27
Помогаю со студенческими работами здесь

Сохранение изображения с заменой
Добрый день! Помогите, пожалуйста. Создаю рисунок, затем его нужно сохранить. Но, рисунок с данным именем существует. Его нужно...

Сохранение изображения из Picturebox
Всем здравствуйте, у меня возник такой вот вопрос в процессе выполнения курсовой, пытаюсь я сохранить изображение фигуры полученного путем...

Сохранение изображения в PictureBox
Доброго времени суток. Столкнулся с довольно странной вещью. Я загружаю картинку в PictureBox. Затем конвертирую в байтовый массив и...

Сохранение изображения в отдельный файл
Всем доброго времени суток. Написал небольшое приложение, суть в приложении в следующим... Загружаешь изображение в picturebox нажимаешь...

Сохранение изображения, загруженного из файла
Загружаю из файла изображение. public Canvas(String FileName) // загрузка из файла { new_picture = false; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru