Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Преобразование формата файла

41K
26 августа 2008 года
artyomov
2 / / 26.08.2008
Доброго времени суток.
Помогите решить задачку.
Есть файл myfile.bmp с глубиной цвета 1 бит, необходимо скопировать его в файл myfile2.bmp, но уже с глубиной цвета 8 бит.
На одном из форумов мне посоветовали сделать что-то типа этого:
1. Создть массив байт.
2. Загрузить в Bitmap 1 bit - ный bmp
3. Скопировать через lockbits картинку в массив
4. Создать еще один массив байт, который вместит 8 битную картинку.
5. Циклом скопировать первый массив во второй, заполняя лишние байты, таким образом который тебе подойдет.
6. Создать новый Bitmap
7. В новый Bitmap через lockbits, скопировать второй массив.

Помогите реализовать это на C#. Который день мучаюсь, постоянно какието ошибки вылетают.
341
26 августа 2008 года
Der Meister
874 / / 21.12.2007
Неужели Graphics.DrawImage() с этим не справляется? С её помощью можно и цвета заменить, и смасштабировать... Не понимаю, зачем изобретать велосипед, когда уже давно как сверхзвуковые самолёты строят и в космос летают...
41K
26 августа 2008 года
artyomov
2 / / 26.08.2008
Цитата: Der Meister
Неужели Graphics.DrawImage() с этим не справляется? С её помощью можно и цвета заменить, и смасштабировать... Не понимаю, зачем изобретать велосипед, когда уже давно как сверхзвуковые самолёты строят и в космос летают...



Не позвольте изобрести велосипед заново, приведите пример кода ))

Этот код, например, приводит к ошибке.
Bitmap mySource = new Bitmap(MapPath("~/myfile.bmp"));
Graphics g = Graphics.FromImage(mySource);

Ошибка: Сведения об исключении: System.Exception: Невозможно создать объект графики из изображения, имеющего формат с индексированными пикселами.

Исходный файл то 1 битный.

341
27 августа 2008 года
Der Meister
874 / / 21.12.2007
Для исходного файла объект Graphics создавать не надо. Вкратце, схема такова
Код:
using System.Drawing.Imaging;

Bitmap bitmap1bpp = new Bitmap("Monochrome.bmp");
Bitmap bitmap8bpp = new Bitmap("Palette.bmp");

Rectangle rect = new Rectangle(new Point(), bitmap8bpp.Size);

Bitmap buffer = new Bitmap(rect.Width, rect.Height);
using (Graphics g = Graphics.FromImage(buffer))
{
    g.DrawImage(bitmap8bpp, rect);

    bitmap1bpp.MakeTransparent(Color.White); // Не выводим единичные биты
    g.DrawImage(bitmap1bpp, rect);
}

EncoderParameters parameters = new EncoderParameters(1);
parameters.Param[0] = new EncoderParameter(Encoder.ColorDepth, 8);

buffer.Save("out.bmp", ImageCodecInfo.GetImageEncoders()[0], parameters);

// Ну и все объекты типа Bitmap надо бы продиспозить
bitmap1bpp.Dispose();
bitmap8bpp.Dispose();
buffer.Dispose();

Для замены цветов смотри версии Graphics.DrawImage(), принимающие в качестве параметра экземпляр объекта System.Drawing.Imaging.ImageAttributes: у него есть метод SetRemapTable().
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог