Пока даже не очень понял в чем тут проблема, но нашел как решить.
Имею Image, который сохраняю в файл и загружаю из файла.
Сохраняю:
using (MemoryStream ms = new MemoryStream())
{
this.bitmap.Save(ms, ImageFormat.Bmp);
byte[] bitmapData = ms.ToArray();
string imgBase64 = Convert.ToBase64String(bitmapData);
xmlImage.InnerText = imgBase64;
}
Загружаю:
string imgBase64 = xmlImage.InnerText;
if (!string.IsNullOrEmpty(imgBase64))
byte[] bitmapData = Convert.FromBase64String(imgBase64);
using (MemoryStream ms = new MemoryStream(bitmapData))
this.bitmap = Image.FromStream(ms) as Bitmap;
Все работает без проблем - bitmap отображается как нужно, размеры сохранены
и вообще все отлично.
Но если попытаться сохранить этот загруженный image еще раз,
то получаю ошибку:
A generic error occurred in GDI+.
Что сие значит не понятно.
Решил проблему просто, но не понятно - либо не закрывать поток,
либо создавать новый image, соответственно с новым потоком.
Т.е. либо так:
MemoryStream ms = new MemoryStream(bitmapData);
this.bitmap = Image.FromStream(ms) as Bitmap;
Либо так:
this.bitmap = new Bitmap(Image.FromStream(ms) as Bitmap);
Первый вариант мне не нравится, прямо душу режет.
Второй еще пережить можно, хотя не понятно почему и в чем проблема.
UPD: Т.е. получается что при выполнении FromStream используется тот же буфер, что
я создавал в потоке.
UPD: Интересно этот редактор параграфы переставляет. Вроде сохраняешь
нормально, а получается такая каша... Хоть бы пофиксили. Задолбало.
Thursday, September 1, 2011
Tuesday, August 30, 2011
Adobe
Люблю такие продукты... Хочу поставить триал Adobe Illustrator. Захожу на сайт, нашел кнопоку скачать, жму... Скачивается программа скачивания триала. Всего-то 3 Мб. Запускаю - она говорит что ей надо чтобы был установлен Adobe IAR. Сама при этом скачивает его и не собирается - вываливат обычный message box - типа тебе надо, ты и качай. И это только чтобы запустить скачивание триала. Ну мы не гордые, закачал его. Думаете все? Неа. Надо еще завести аккаунт на Adobe и получить Adobe ID. Вот тогда мне дадут скачать триал.
Вот так все круто и очень любезно для пользователей.
Вот так все круто и очень любезно для пользователей.
Tuesday, August 9, 2011
AssemblyResolve и локализация
В .NET 4.0 имеется небольшая, но не приятная проблема - обработчик загрузки модулей AsseblyResolve теперь вызывается, если не найден файл с ресурсами локализации xxx.resources.dll.
Проблема возникает при переходе с 2.0 на 4.0 для тех, кто генерил исключения в AssemblyResolve, если файл не найден. Правильнее возвращать null - тогда падать не будет. Иначе ждет сюрприз...
Проблема возникает при переходе с 2.0 на 4.0 для тех, кто генерил исключения в AssemblyResolve, если файл не найден. Правильнее возвращать null - тогда падать не будет. Иначе ждет сюрприз...
Wednesday, July 27, 2011
Как правильно подключить обработчик AssemblyResolve в WinForms
Возник интересный вопрос – в какой момент правильнее подключить AssemblyResolve, который, как известно, позволяет подложить нужные dll, если система сама их не нашла.
Вариант 1 – делаем в конструкторе основной формы
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
AppDomain.CurrentDomain.AssemblyResolve +=
new ResolveEventHandler(CurrentDomain_AssemblyResolve);
Этот вариант будет работать только в том случае, если форма не использует искомые dll для UI, т.е. конструктор успеет вызваться. Для подключения таким образом UI-компонентов этот вариант не работает.
Вариант 2 – в методе Main
Этот вариант работает, если нужные dll не должны сразу загрузиться в домент. Даже если главная форма использует dll для построения UI, то это будет работать. Если же dll нужны для создания Application, то и этот вариант не сработает.
Вариант 3 – самый надежный, статический конструктор Program
Создаем статический конструктор для основного класса.
static class Program
{
static Program()
{
AppDomain.CurrentDomain.AssemblyResolve +=
new ResolveEventHandler(CurrentDomain_AssemblyResolve);
Application.SetUnhandledExceptionMode(
UnhandledExceptionMode.CatchException);
}
Теперь обработчик будет гарантированно создан.
Thursday, May 19, 2011
Программирование это...
Программирование это творчество или бизнес? Вроде творчество, но мы хотим за него получать денег... Вроде бизнес, но мы говорим что сегодня нет настроения :) Не прет...
Я сравнивал изучение программирования с обучением плаванию - пока сам не попробуешь, ничего не получится. С бортика учить не выйдет, по книгам тоже. Только пробовать.
С точки зрения бизнеса - изучение программирования сводится к эффективности работы. Правильный код, правильная архитектура.
Но хочу сказать что просто программировать мало, чтобы быть программистом. Ну как пианист. Как творчество. На клавиши все нажимать умеют, ноты все могут выучить. Но стать настоящим композитором, настоящим пианистом - только единицы. Нужно что-то большее, чем просто нажатие клавиш в нужной последовательности и в нужные моменты. Что-то творческое...
Так творчество или бизнес?...
Я сравнивал изучение программирования с обучением плаванию - пока сам не попробуешь, ничего не получится. С бортика учить не выйдет, по книгам тоже. Только пробовать.
С точки зрения бизнеса - изучение программирования сводится к эффективности работы. Правильный код, правильная архитектура.
Но хочу сказать что просто программировать мало, чтобы быть программистом. Ну как пианист. Как творчество. На клавиши все нажимать умеют, ноты все могут выучить. Но стать настоящим композитором, настоящим пианистом - только единицы. Нужно что-то большее, чем просто нажатие клавиш в нужной последовательности и в нужные моменты. Что-то творческое...
Так творчество или бизнес?...
Wednesday, May 4, 2011
Зачем переписывать у соседа код?
Замечаю что многие студенты вместо того чтобы писать программу сами, переписывают ее у соседа с экрана. Я не возражаю - если хочется работать секретарем/секретаршей, то почему не поучиться быстро набирать на клавиатуре текст? Но какое это отношение имеет к программированию понять не могу.
Представил себе занятия по плаванию - стою я на суше, махаю руками, делаю точно также как тот, который в воде барахтается... Интересно - научусь или нет? Что-то сомнительно.... Или в качалке - один потеет, железки таскает, другой повторяет движения... Возможно даже какой-то результат и будет, но совсем не такой, как у того, который сам.
Мой совет - пишите код сами. Лучше взять задачку попроще и сделать ее. Потом взять сложнее, потом еще сложнее... Ни кто же не гонит, не торопит. Зачем хватать очень сложную задачу, понимая что ее не выполнить и этим оправдывать свое бездействие.
В той же качалке - берем сразу огромный вес, который придавит. Зовем здоровенного качка, просим "подними за меня, я не могу". Ну он-то понятно поднимет, может даже и не вспотеет, здоровый он. А вам-то что с этого толку? Даже морального удовольствия нет...
Представил себе занятия по плаванию - стою я на суше, махаю руками, делаю точно также как тот, который в воде барахтается... Интересно - научусь или нет? Что-то сомнительно.... Или в качалке - один потеет, железки таскает, другой повторяет движения... Возможно даже какой-то результат и будет, но совсем не такой, как у того, который сам.
Мой совет - пишите код сами. Лучше взять задачку попроще и сделать ее. Потом взять сложнее, потом еще сложнее... Ни кто же не гонит, не торопит. Зачем хватать очень сложную задачу, понимая что ее не выполнить и этим оправдывать свое бездействие.
В той же качалке - берем сразу огромный вес, который придавит. Зовем здоровенного качка, просим "подними за меня, я не могу". Ну он-то понятно поднимет, может даже и не вспотеет, здоровый он. А вам-то что с этого толку? Даже морального удовольствия нет...
Tuesday, May 3, 2011
Subscribe to:
Posts (Atom)