С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
2 / 2 / 2
Регистрация: 04.09.2012
Сообщений: 9

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

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

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

Стоит задача разбить 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, сохранен как 256-цветный рисунок bmp), цвет которого...

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

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

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

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  [ТС]
Нашел огрех в функции разложения:
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.03.2014, 16:41
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
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? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru