2 / 2 / 2
Регистрация: 04.09.2012
Сообщений: 9
1

Создание монохромного bmp из одной из 24-х плоскостей 24-битного bmp

12.03.2014, 20:06. Показов 3444. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.

Стоит задача разбить 24-х битное bmp изображение на 24 плоскости с последующей возможностью генерации 24 монохромных изображений. Перевести изображение в массив байт или бит проблем не составляет, как и получить любую из 24-х плоскостей. Проблема заключается в том, чтобы перевести любую из полученных плоскостей в монохромный bmp.

Итак, на форме есть PictureBox, в который загружается исходная картинка. Далее картинка кладется в переменную
C#
1
Image IMG;
Функция
C++
1
IMG = Image.FromFile(d.FileName);
По нажатию кнопки выполняется функция, в которой я пытаюсь на уровне байт/бит сформировать новое изображение:
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
private void CompressTSMI_Click(object sender, EventArgs e)
{            
            ImageConverter convertIB = new ImageConverter();
            byte[] A;
            A = (byte[])convertIB.ConvertTo(IMG, typeof(byte[])); // перевод Image в массив байт
            convertIB = null;
            int k=Convert.ToInt16(tbN.Text); // номер байта из 24 байт RGB
            
            BitArray B = new BitArray(A); // перевод массива байт в массив бит
            //A[10] - начало растра       
            //A[28] - разрядность изображения
            BitArray C = new BitArray((A.Length - A[10])  / A[28]); // растр нового изображения (без заголовков) в битах
            
            // кладем определенные биты в массив бит нового изображения
            for (int i = 0; i < ((A.Length - A[10])  / A[28]); i++)
            {
                
                C.Set(i,B.Get(A[10] * 8 + 24 * i + k));
            }
 
            byte[] D = new byte[A[10]+IMG.Height*IMG.Width+8]; // байты нового изображения
            // пишем в них старый зоголовок
            for (int i = 0; i < A[10]; i++)
            {
                D[i] = A[i];
            }
            // изменяеv некоторые параметры
            D[10] = 62; // начало растра
            D[28] = 1; // разрядность
            D[46] = 2; // количество используемых цветов 
            D[50] = 2; // количество важных цветов
            // определяем палитру
            D[54] = D[55] = D[56] = 0;
            D[57] = D[58] = D[59] = D[60] = D[61] = 255;
            Byte[] size = new byte[4];
            size = BitConverter.GetBytes(62 + IMG.Height * IMG.Width );
            for (int i = 0; i < 4; i++)
            {
                D[2+i] = size[0+i];
            }
            // и переносим биты черно-белого растра в байты растра нового изображения
            C.CopyTo(D, 62); // перевод массива бит в массив байт начиная с 62-го элемента
 
            IMG = byteArrayToImage(D); //Перевод массива байт в Image
            pb.Image = IMG; // помещаем получившуюся картинку в PictureBox
}
На выходе функции изображение получается некорректное. Тестовое изображение имеет разрешение 800 на 600.

Функция переноса массива байт в image
C#
1
2
3
4
5
6
public Image byteArrayToImage(byte[] byteArrayIn)
        {
            MemoryStream ms = new MemoryStream(byteArrayIn);
            Image returnImage = Image.FromStream(ms);
            return returnImage;
        }

Функция, переводящая картинку в массив байт, потом в массив бит и обратно в изображение (без изменений) работает хорошо.

C#
1
2
3
4
5
6
7
8
9
10
        private void CompressTSMI_Click(object sender, EventArgs e)
        {
            ImageConverter convertIB = new ImageConverter();
            byte[] A;
            A = (byte[])convertIB.ConvertTo(IMG, typeof(byte[])); // перевод Image в массив байт
            convertIB = null;
            BitArray B = new BitArray(A); // перевод массива байт в массив бит
            B.CopyTo(A, 0); // перевод массива бит в массив байт
            IMG = byteArrayToImage(A); //Перевод массива байт в Image
            pb.Image = IMG;
Подскажите, может я что-то упускаю? Или может есть библиотеки, которые на основе массива бит формирует монохромное изображение?

Пробовал делать через bitmap, но размер массива на выходе convertIB.ConvertTo(IMG, typeof(byte[])); получается не 1440054
(1440054=800*600*3+54, где
800*600 разрешение,
3 - байт на пиксель,
54 - размер заголовка).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.03.2014, 20:06
Ответы с готовыми решениями:

Как программно изменить цвет монохромного рисунка *.bmp?
На форме используется Image из белого фона с одноцветным рисунком (рисован в Paint-e, сохранен как...

Вывод 24-битного BMP-изображения
Написал код .286 ASSUME CS:CODE,DS:CODE CODE segment ORG 100h start: mov ax,13h int 10h ...

Вывод 24 битного BMP из файла
Подскажите, пожалуйста, как прочитать 24 битный BMP файл и осуществить его вывод в 13h графическом...

Работа с BMP-файлами (класс "8 битное BMP изображение)
Написать класс &quot;8 битное BMP изображение&quot;.Класс должен содержать 3 конструктора: конструктор по...

2
2 / 2 / 2
Регистрация: 04.09.2012
Сообщений: 9
14.03.2014, 20:59  [ТС] 2
Переписал код на

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
47
48
Bitmap bIMG;
private byte[] ConvertBitMapToByte(Bitmap img)
        {
            Rectangle rect = new Rectangle(0, 0, img.Width, img.Height);
            System.Drawing.Imaging.BitmapData bmpData = img.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bIMG.PixelFormat);
            IntPtr ptr = bmpData.Scan0;
            int bytes = Math.Abs(bmpData.Stride) * img.Height;
            byte[] pixelValues = new byte[bytes];
            System.Runtime.InteropServices.Marshal.Copy(ptr, pixelValues, 0, bytes);
            img.UnlockBits(bmpData);
            return pixelValues;
        }
 
        // перевод массива байт в изображение
        private Bitmap ConvertByteToBitMap(byte[] pixelValues, Int32 Width, Int32 Heigh,  System.Drawing.Imaging.PixelFormat format)
        {
            IntPtr ptr = Marshal.AllocHGlobal(pixelValues.Length);
            Marshal.Copy(pixelValues, 0, ptr, pixelValues.Length);
            int Stride=0;
            if (format == PixelFormat.Format24bppRgb) Stride = 2400;
            if (format == PixelFormat.Format1bppIndexed) Stride = 100;
 
            Bitmap img = new Bitmap(Width, Heigh, Stride, format, ptr);
            
            return img;
        }
private void CompressTSMI_Click(object sender, EventArgs e)
        {
            byte[] A = ConvertBitMapToByte(bIMG);
            int Npixel = Convert.ToInt16(tbN.Text);
            BitArray B = new BitArray(A);
 
            BitArray C = new BitArray(A.Length/24);
 
            for (int i = 0; i < A.Length / 24; i++)
            {
                C[i] = B[24 * i + Npixel];
            }
 
            byte[] D = new byte[C.Length/8];
 
            C.CopyTo(D, 0);
 
            bIMG = ConvertByteToBitMap(D, bIMG.Width, bIMG.Height, PixelFormat.Format1bppIndexed);
 
            pb.Image = bIMG;
            
        }
надеюсь, что работает верно.
1
2 / 2 / 2
Регистрация: 04.09.2012
Сообщений: 9
18.03.2014, 16:41  [ТС] 3
Нашел огрех в функции разложения:
C#
1
2
3
4
5
 BitArray C = new BitArray(B.Length/24);
for (int i = 0; i < C.Length / 24; i++)
{
       C[i] = B[24 * i + Npixel];
}
1
18.03.2014, 16:41
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.03.2014, 16:41
Помогаю со студенческими работами здесь

Изображение bmp, операция над ним, снова в bmp
Задание состоит в следующем: 1. Перевести изображение в матрицу. 2. Удалить определенные...

Конвертер BMP 32 bit BGRA в BMP 8 bit c Palette
Добрый день! есть следующий вариант преобразования procedure TForm1.Button1Click(Sender:...

Создание bmp файлов на С++
Поделитесь пожалуйста информацией о том как создавать bmp файл на языке С++, а точнее создать файл...

Создание и вывод Bmp
Всем привет! Хотелось бы обратиться к вам с помощью ! У меня не получается создать и вывести в...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

Новые блоги и статьи
Какая разница между операторами == и === в сравнениях в JavaScript
bytestream 21.01.2025
В мире веб-разработки JavaScript занимает особое место как динамический язык программирования, предоставляющий разработчикам широкий набор инструментов для создания интерактивных веб-приложений. . . .
Из чего и как собрать свой домашний кинотеатр
bt_guru 21.01.2025
Создание домашнего кинотеатра: от идеи до реализации В современном мире домашний кинотеатр стал неотъемлемой частью комфортного жилого пространства, предоставляя возможность наслаждаться. . .
Ошибки стиральных машин
bt_guru 21.01.2025
Современные стиральные машины представляют собой сложные электронные устройства, оснащенные множеством датчиков и систем контроля. Они способны самостоятельно определять вес загруженного белья,. . .
Копирование (маппинг) объектов в JavaScript
bytestream 21.01.2025
В современной разработке программного обеспечения копирование объектов представляет собой фундаментальную операцию, которая требует особого внимания и понимания. Маппинг объектов в JavaScript – это. . .
Как работать с Apache Kafka в C# .NET
bytestream 21.01.2025
Apache Kafka представляет собой распределенную платформу потоковой передачи данных, которая произвела революцию в области обработки больших объемов информации в реальном времени. Эта система,. . .
Как использовать RabbitMQ в C# .NET
bytestream 21.01.2025
RabbitMQ представляет собой мощный брокер сообщений, который эффективно решает эту задачу, обеспечивая надежную передачу данных между множеством приложений. Этот инструмент реализует протокол AMQP. . .
Как объединить последние коммиты в Git
bytestream 21.01.2025
В мире разработки программного обеспечения система контроля версий Git стала незаменимым инструментом для управления исходным кодом. Одной из наиболее полезных, но порой сложных для освоения функций. . .
Как запушить новую локальную ветку (branch) в удалённый репозиторий Git и отслеживать её
bytestream 21.01.2025
В современной разработке программного обеспечения система контроля версий Git стала неотъемлемым инструментом для эффективного управления кодом и организации командной работы. Одной из ключевых. . .
Как создать директорию и все родительские директории, указанные в пути, с помощью Python
bytestream 21.01.2025
Python предоставляет мощные инструменты для работы с файловой системой через встроенные модули os и pathlib, которые значительно упрощают процесс манипуляции директориями. Эти модули содержат. . .
Как работать с массивами в JavaScript
bytestream 21.01.2025
Массивы в JavaScript представляют собой один из фундаментальных типов данных, который позволяет хранить упорядоченные коллекции различных элементов в одной переменной. Эта структура данных является. . .
Какая максимальная длина адреса (URL) в различных браузерах и стандартах
bytestream 21.01.2025
В современном мире интернет-технологий URL-адреса (Uniform Resource Locator) играют фундаментальную роль в функционировании веб-пространства. Эти уникальные идентификаторы ресурсов стали неотъемлемой. . .
Как сбросить локальный репозиторий до состояния удалённого репозитория Git
bytestream 21.01.2025
При разработке программного обеспечения с использованием системы контроля версий Git разработчики часто сталкиваются с необходимостью синхронизации локального и удаленного репозиториев. Данная задача. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru