Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
7 / 7 / 3
Регистрация: 10.04.2015
Сообщений: 57

Ошибка при сериализации Image

28.10.2016, 23:43. Показов 3937. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При серализации Image вылетает исключение: В GDI+ возникла ошибка общего вида.
PS: Если вместо Image использую Bitmap все работает !
StackTrace:
Кликните здесь для просмотра всего текста
в System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams)
в System.Drawing.Image.Save(MemoryStream stream)
в System.Drawing.Image.System.Runtime.Seri alization.ISerializable.GetObjectData(Se rializationInfo si, StreamingContext context)
в System.Runtime.Serialization.Formatters. Binary.WriteObjectInfo.InitSerialize(Obj ect obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder)
в System.Runtime.Serialization.Formatters. Binary.ObjectWriter.Write(WriteObjectInf o objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo)
в System.Runtime.Serialization.Formatters. Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
в System.Runtime.Serialization.Formatters. Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)
в System.Runtime.Serialization.Formatters. Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph)
в MSNClient.Client.Sender(Message msg) в C:\Users\Pasha\Documents\Visual Studio 2015\Projects\MSNClient\MSNClient\Client .cs:строка 103

Код метода в котором объект сериализуеться:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 public void Sender(MessageLib.Message msg)
        {
            try
            {
                BinaryFormatter binFormat = new BinaryFormatter();
                byte[] buff = new byte[10000000];
                using (var memoryStream = new MemoryStream())
                {
                    (new BinaryFormatter()).Serialize(memoryStream, msg); // <- тут ексепшин...
                    buff = memoryStream.ToArray();
                    client.Send(buff);
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
                Connect();
 
            }
.dll которую сериализую:
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
41
42
43
44
45
46
using System;
using System.Drawing;
 
namespace MessageLib
{
    [Serializable]
    public class Message
    {
        public string GetCommand { get; set; }
        public string GetHWID { get; set; }
        public string GetAntiVir { get; set; }
        public string GetOS { get; set; }
        //public Bitmap GetImgBitmap { get; set; }
        public Image GetImg { get; set; }
        public Message(string command, string hwid, string antiv, string os)
        {
            GetCommand = command;
            GetHWID = hwid;
            GetAntiVir = antiv;
            GetOS = os;
        }
        public Message(string command)
        {
            GetCommand = command;
        }
        public Message(string hwid, string antiv, string os)
        {
            
            GetHWID = hwid;
            GetAntiVir = antiv;
            GetOS = os;
        }
        public Message(string hwid, string antiv, string os,Image img)
        {
            GetImg = img;
            GetHWID = hwid;
            GetAntiVir = antiv;
            GetOS = os;
        }
        public Message(Image bm)
        {
            GetImg = bm;
        }
    }
 
}
Добавлено через 11 минут
Я надеюсь это ошибка не связана с тем что Image абстрактный класс ?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.10.2016, 23:43
Ответы с готовыми решениями:

Ошибка при Xml сериализации
Возникает исключение при Xml сериализации. Собственно объект - ArrayList с объеками моего класса Abonent. Скриншот ниже. Текст ошибки :...

Ошибка при сериализации XML
возникает исключение при сериализации xml файла вот такого вида - &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt; ...

Ошибка при сериализации объекта с помошью XmlSerializer
Всем доброго времени суток. Работаю над созданием сетевого приложения клиент-сервер, одной из функций которого является передача файлов....

12
Эксперт .NET
 Аватар для Usaga
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,406
29.10.2016, 05:40
Bespredeliwe, приведи текст ошибки и тип исключения. Стёк вызовов ничего об ошибке не говорит.
0
7 / 7 / 3
Регистрация: 10.04.2015
Сообщений: 57
29.10.2016, 11:07  [ТС]
Usaga, System.Runtime.InteropServices.ExternalE xception: "В GDI+ возникла ошибка общего вида."
0
Эксперт .NET
 Аватар для Usaga
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,406
29.10.2016, 12:23
Лучший ответ Сообщение было отмечено Bespredeliwe как решение

Решение

Bespredeliwe, похоже, что не ты один с такой проблемой столкнулся. Как решение можно переопределить логику сериализации для класса Message, где объект Image будет явно сохраняться в BMP или PNG.

Судя по стёку вызова (который, таки, пригодился) сериализация Image так и происходит - он тупо сохраняется с помощью Image.Save, но, видимо, в формат JPEG с которым и возникают проблемы (по ссылке сказано, что на XP проблемы нет, странно).

И ещё, зачем ты выделяешь буфер в почти 10 мегабайт:

C#
1
byte[] buff = new byte[10000000];
... если потом всё равно переписываешь ссылку на него другим буфером:

C#
1
buff = memoryStream.ToArray();
Надеюсь это было сделано по невнимательности.
1
7 / 7 / 3
Регистрация: 10.04.2015
Сообщений: 57
29.10.2016, 12:45  [ТС]
Usaga, Спасибо за ответ, да код кустарный, все правлю на ходу, поэтому это осталось с прошлых вариантов, и пока не привел весь код к надлежащему виду. Странно почему именно на формате Jpeg возникает данное исключение.

Добавлено через 9 минут
Еще вопрос, как сохранить картинку с потерей качества ? мне не нужна картинка с качеством 48 бит/пиксель. Хочу пожать картинку до максимума и передать ее на сервер для уменьшения нагрузки на интернет соединение.
0
Эксперт .NET
 Аватар для Usaga
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,406
29.10.2016, 13:03
Если твоя картинка реально имеет 48 бит на пиксель, то тогда понятно, почему Image не смог её в JPEG сохранить)

Добавлено через 4 минуты
Тебе нужно будет "руками" (другого способа я не знаю) перегнать иЗображение в 24-битный формат (это не сложно, но API для этого я не знаю) и сохранить в JPEG с помощью Image.Save(). Данный метод позволяет настраивать качество JPEG-копрессии.
0
7 / 7 / 3
Регистрация: 10.04.2015
Сообщений: 57
29.10.2016, 14:21  [ТС]
Usaga,
Появился такой вопрос, есть метод
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 public static Image GetScreenShot()
        {
 
            Graphics graph = null;
            var jpg = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
            
            graph = Graphics.FromImage(jpg);
            graph.CopyFromScreen(0, 0, 0, 0, jpg.Size);
 
         
            using (var stream = new MemoryStream())
            {
                jpg.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
                Image img = Bitmap.FromStream(stream);
                return img;
            }
 
        }
Какой PixelFormat указывать в конструкторе Bitmap что бы все прокатило ?
0
Эксперт .NET
 Аватар для Usaga
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,406
29.10.2016, 16:16
Bespredeliwe, ну там не так много форматов на выбор, поэкспериментируй.
0
7 / 7 / 3
Регистрация: 10.04.2015
Сообщений: 57
29.10.2016, 16:33  [ТС]
Usaga, Экспериментировал, не один из способов не избавил от ошибки: System.Runtime.InteropServices.ExternalE xception: "В GDI+ возникла ошибка общего вида."

Видимо трабла в чем то другом... Похоже для передачи JPEG мне придется передавать на сериализацию массив байтов, вместо объекта Image.
0
Эксперт .NET
 Аватар для Usaga
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,406
29.10.2016, 16:40
Bespredeliwe, зачем ты вызываешь Bitmap.FromStream, когда можно Image.FromStream?

И ещё, если речь идёт о каком-то самопальном TeamViewer, то рекомендую пошариться по данному форуму, на моей памяти тут приводили очень интересный пример (который работал) по потоковой передаче изображений с рабочего стола. Только кадр передавался не сплошным файлом (как у тебя), а разбивался на маленькие фраменты и передавался через UDP.

Добавлено через 25 секунд
А вообще, странно, что Image.Save глючит. Оно и в файл не может сохранить?
0
7 / 7 / 3
Регистрация: 10.04.2015
Сообщений: 57
29.10.2016, 17:14  [ТС]
Usaga,
Цитата Сообщение от Usaga Посмотреть сообщение
зачем ты вызываешь Bitmap.FromStream, когда можно Image.FromStream?
а есть ли разница ?, Bitmap.FromStream унаследован от Image.FromStream вроде как.
Цитата Сообщение от Usaga Посмотреть сообщение
И ещё, если речь идёт о каком-то самопальном TeamViewer, то рекомендую пошариться по данному форуму, на моей памяти тут приводили очень интересный пример (который работал) по потоковой передаче изображений с рабочего стола. Только кадр передавался не сплошным файлом (как у тебя), а разбивался на маленькие фраменты и передавался через UDP.
Да, я сейчас разбираюсь как вообще это все в целом реализуется, про организацию передачи данных по "кускам" имею представление, но пока что рано за это браться.

Цитата Сообщение от Usaga Посмотреть сообщение
А вообще, странно, что Image.Save глючит. Оно и в файл не может сохранить?
Скажем так, все работает и сохраняется локально. Как только вызывается
C#
1
(new BinaryFormatter()).Serialize(memoryStream, msg)
все летит.
0
Эксперт .NET
 Аватар для Usaga
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,406
29.10.2016, 17:19
Bespredeliwe, ну тут я тебе помочь не могу, извини. Попробуй в Message сохранять массив байт, а на принимающей стороне восстанавливать изображение...

Хотя, может быть, кто-нибудь чего полезнее подскажет.
0
7 / 7 / 3
Регистрация: 10.04.2015
Сообщений: 57
29.10.2016, 17:19  [ТС]
Usaga, Я уже так и сделал )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.10.2016, 17:19
Помогаю со студенческими работами здесь

Ошибка при сериализации - "тип недоступен в силу его уровня защиты"
При записи в пустой существующий файл, у меня выдаёт ошибку - Необработанное исключение типа &quot;System.InvalidOperationException&quot; в...

Ошибка при сериализации
При компиляции вылетает такая ошибка: Cannot create and instance of the abstract class or interface &quot;System.Xml.XmlWriter&quot;. ...

Ошибка при сериализации
случилось у меня такая ситуация, что есть у меня класс, который я успешно сериализовал, после изменений в проекте (без изменений этого...

Ошибка при сериализации класса AL7_Class_ExtFileInfo
Здравствуйте. Есть 2 класса. using System; using System.IO; namespace DH_Launcher { public class...

Ошибка InvalidOperationException при Xml сериализации
Здравствуйте! У меня возникла проблема при xml сериализации. Суть проблемы такова, я хочу сохранить список List&lt;myReference&gt; в...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru