Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/34: Рейтинг темы: голосов - 34, средняя оценка - 4.91
1 / 1 / 0
Регистрация: 30.06.2021
Сообщений: 24

MFC проблема с рисунком

14.07.2021, 10:51. Показов 6438. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня 60 картинок формата bmp. Подразумевается, что все они могут быть разных размеров. Для экономии места все эти картинки сжимаются до 1 бита на пиксель, т.е. в одном байте хранится информация о 8 пикселях. Я записал их в текстовый файл в таком формате: Размер по Х - Размер по У - Имя - [Битовая карта (Х*У)]...След. картинка...
Но проблема в том, что с форматом 8*16 (для которого я изначально писал прогу) никаких проблем нет, а если размер картинки изменить, то плывут все изображения (они выводятся в ряд все сразу).
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
{
    
 
        CPaintDC dc(this); // device context for painting
        
             COLORREF Color;
             int slave=0,XSize=0, YSize=1;
             
                    
             for(bits=3; bits<1034; bits+=buff[YSize]+3) // buff[0]-Ширина Х. buff[1]-Высота Y. buff[2]-Имя
    
    {
        for ( ii = 0; ii < buff[YSize] ; ii++) // Высота
    {
        for (i = 0; i < buff[XSize]; i++) // Ширина
        {
            if (((buff[ii+bits] >> i) & 1) == 1)
            
                Color = RGB (255, 255, 255);
            
            else  // иначе
 
                Color = RGB (0, 0, 0);
 
            SetPixel(dc, buff[XSize]-i+slave, buff[YSize]-ii, Color); // рисуем каждый
                  
         }
        
      }
        slave+=10; //Cмещение 
        
        XSize+=buff[YSize]*buff[XSize]/8+3; // Размеры следующей картинки
        YSize=XSize+1;
        
    }
}
Подскажите как исправить

Добавлено через 9 минут
Цитата Сообщение от Shpork Посмотреть сообщение
(они выводятся в ряд все сразу).
Так быть и должно, но проблема в том, что они все плывут

Добавлено через 28 минут
Цитата Сообщение от Shpork Посмотреть сообщение
if (((buff[ii+bits] >> i) & 1) == 1)
Вот здесь ошибка
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.07.2021, 10:51
Ответы с готовыми решениями:

Проблема с MFC
При создании проекта на языке С++ (Visual Studio 2019 Community) с основой MFC, возникает такая проблема: Надпись в шаблоне (окне)...

MFC проект CTime проблема с операторами
Проблема с кодом в мфц проекте! SYSTEMTIME dd1; Data2.GetTime(&amp;dd1); CTime Data2 = CTime(dd1); CTime Data1 = CTime(2001, 7,...

Проблема с COM и MFC Dialog-based Application
Уважаемый Олл! В Visual C++ знаний крайне немного, начал разбираться и столкнулся с проблемой, причину которой не могу понять. В...

3
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,119
14.07.2021, 11:49
Shpork, давайте уточним.
1. Есть один буфер buff, в котором лежат все картинки.
2. Каждая картинка имеет три байта заголовка и ещё несколько байт под пиксели.
3. Каждый пиксель кодируется одним битом (0-черное, 1-белое)
4. Восемь горизонтальных пикселей упаковываются в один байт (0 бит - первый пиксель, 1 бит - второй и т.д.)
5. Что происходит, если длина строки в пикселях (ширина картинки) не кратна 8? Предусматривается ли выравнивание строк? Новая строка картинки всегда начинается с нового байта или же в одном байте может оказаться сразу конец одной строки и начало другой?
0
1 / 1 / 0
Регистрация: 30.06.2021
Сообщений: 24
14.07.2021, 12:21  [ТС]
1. Есть один буфер buff, в котором лежат все картинки.
2. Каждая картинка имеет три байта заголовка и ещё несколько байт под пиксели.
3. Каждый пиксель кодируется одним битом (0-черное, 1-белое)
4. Восемь горизонтальных пикселей упаковываются в один байт (0 бит - первый пиксель, 1 бит - второй и т.д.)
Все верно
Цитата Сообщение от Ygg Посмотреть сообщение
Что происходит, если длина строки в пикселях (ширина картинки) не кратна 8? Предусматривается ли выравнивание строк?
В этом, собственно, и проблема, я не знаю как это реализовать.
В одном байте может лежать несколько строк
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,119
14.07.2021, 13:04
Лучший ответ Сообщение было отмечено Shpork как решение

Решение

Цитата Сообщение от Shpork Посмотреть сообщение
В одном байте может лежать несколько строк
Обычно, всё таки, используют выравнивание строк.
Даже в формате BMP предусматривается выравнивание строк по два байта.

Если не использовать выравнивания, то цикл может выглядеть как-то так:
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
    char buff[10000]; // буфер
    char* buff_end = buff + 5089; // конец реальных данных внутри буфера (данное число указано для примера)
 
    COLORREF color[2] = { RGB(0,0,0), RGB(255,255,255) };
 
    // цикл по картинкам внутри буфера
    for (char* ptr = buff; buff < buff_end; )
    {
        // читаем заголовок
        int cx = ptr[0];
        int cy = ptr[1];
 
        // переходим к битам
        ptr += 3;
 
        // цикл по всем строкам картинки
        for (int y = 0; y < cy; y++)
        {
            // цикл по одной строке картинки
            for (int x = 0; x < cx; x++)
            {
                // номер бита
                int bitNumber = y*cx + x;
                // получаем из номера бита байт и смещение внутри байта
                int byte = bitNumber / 8;
                int bit = bitNumber % 8;
 
                // рисуем пиксель
                // ((ptr[byte] >> bit) & 1) - значение бита пикселя
                SetPixel(dc, slave + cx - x, cy - y, color[(ptr[byte] >> bit) & 1]);
            }
 
        }
 
        // смещение до следующей картинки на экране
        slave += cx + 10;
 
        // количество бит в картинке
        int bitsCount = cx * cy;
        // минимальное количество байт необходимых для хранения нужного количества бит
        int bytesCount = (bitsCount + 7) / 8;
        // переходим к следующей картинке в буфере
        ptr += bytesCount;
    }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.07.2021, 13:04
Помогаю со студенческими работами здесь

MSVC проблема с кодировкой в приложении MFC
Задача В MFC-приложении используется диалоговое окно и функция SetWindowText(). Для вывода текста в окно необходимо менять при...

Построчное чтение и вывод строк в ListBox каждые 5 секунд (MFC, проблема с таймером)
Здравствуйте. Такая ситуация: Есть txt файл. Я хочу читать построчно и выводить строки в ListBox (при нажатии кнопки)через каждые...

Работа с рисунком
Здравствуйте! Необходимо, чтобы рисунок не исчезал под другими окнами, перерисовывался при изменении размера окна (масштабирование по...

Работа с рисунком
Здравствуйте, помогите пожалуйста решить следующую задачу: Рисунок разбит на горизонтальные и вертикальные прямоугольники, часть из...

Прозрачный с рисунком
Вопрос такой как сделать например PaintBox прозрачным по определенному цвету, так чтоб можно было рисовать и линии были видны а под ними...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru