Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 22.11.2015
Сообщений: 37

Преобразование любого bmp в int массив

16.09.2017, 17:37. Показов 1966. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, пишу программу которая бы преобразовывала bmp (в идеале - любой битности) в int массив, а лучше в черно белое изображение. Использовать надо чистый с++. Идея следующая - складываю значения байтов R,G,B и делю на 3, если >128 то пишу 1, если меньше - 0. Для монохромных изображений просто преобразование BYTE в int, там делить ничего не надо вроде. Когда даю программе 32 битное изображение то на выходе получается массив 0 и 1 напоминающий изначальное изображение но с сильным смещением. Не пойму в чем ошибка, если проблема в выравнивании то подскажите пожалуйста где и как это учесть? Да, и с 24 битными неработает вообще...все значения dataout[] - нули.
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <iostream>
#include <cstdio>
 
typedef unsigned char BYTE;
using namespace std;
int main(int argc, char *argv[])
{
    if (argc > 2) // проверка на правильный запуск
    {
        cout << "Error" << endl;
        return 0;
    }
    FILE *f = fopen(argv[1], "r");     // открываем фото кторое надо преобразовать. "r" значит "читать"
    BYTE _info[54];                    //сюда запишем информацию(54 первых байта это инфа о битмапе)
    fread(_info, sizeof(BYTE), 54, f); //прочитаем эти 54 байта и запишем в массив _info
    int width = *(int *)&_info[18];    //width(pixels)
    int height = *(int *)&_info[22];   //height(pixels)
    int bitcount = *(int *)&_info[28]; //кол-во бит на пиксель
 
    int sizein = 0;
    if (bitcount == 1)
    {
        cout << "bitcount = 1" << endl;
        int size = width * height;     // посчитаем размер массива
        BYTE *datain = new BYTE[size]; //создадим его
        int *dataout = new int[size];  //создадим массив для 0 или 1(конвертированого изображения)
        for (int i = 0; i < size; i++)
        {
            BYTE buf;
            fread(&buf, sizeof(BYTE), 1, f);
            dataout[i] = int(buf);
        }
        fclose(f);
        for (int i = 0; i < 900; i++)
        {
            if (i % 31 == 0)
            {
                cout << endl;
            }
            cout << dataout[i] << " ";
        }
        return 0;
    }
    if (bitcount == 24)
    {
        cout << "bitcount = 24" << endl;
        sizein = 3;
    }
    if (bitcount == 32)
    {
        cout << "bitcount = 32" << endl;
        sizein = 4;
    }
    else
    {
        cout << "btcount is undefined" << endl;
        sizein = 4;
    }
    int size = width * height * sizein;     // посчитаем размер массива
    BYTE *datain = new BYTE[size];          //создадим его
    int *dataout = new int[width * height]; //создадим массив для 0 или 1(конвертированого изображения)
    int counter = 0, r = 0;
    int padding = (4 - (width * 3) % 4) % 4;
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            BYTE buf[sizein];
            counter = 0;
            fread(buf, sizeof(BYTE), sizein, f);
            for (int k = 0; k < sizein; k++)
            {
                counter += int(buf[k]);
            }
            counter /= 3;
            if (counter > 128)
            {
                dataout[r] = 1;
            }
            if (counter <= 128)
            {
                dataout[r] = 0;
            }
            r++;
        }
    }
    fclose(f);
    for (int i = 0; i < 900; i++)
    {
        if (i % 31 == 0)
        {
            cout << endl;
        }
        cout << dataout[i] << " ";
    }
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.09.2017, 17:37
Ответы с готовыми решениями:

Преобразование bmp в массив short
Необходимо преобразовать картинку bmp в массив short. Как преобразовать в byte представляю, а как в short(что бы цвет пикселя хранился в 2...

Вернуть массив из метода ("Неявное преобразование из int[*,*] в int[] невозможно")
Здравствуйте. Подскажите как вернуть массив из метода? Метод принимает в себя текстовую строку, на ей основе генерирует массив и нужно...

Создать динамический массив, любого простого типа (например: int, long, float, double)
1. Создать проект, который содержит консольную программу Win32. 2. Создать динамический массив, любого простого типа (например: int,...

4
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,631
16.09.2017, 18:13
https://stackoverflow.com/ques... o-an-array
0
0 / 0 / 0
Регистрация: 22.11.2015
Сообщений: 37
17.09.2017, 08:38  [ТС]
afront, я пользоваться интернетом умею, этих тем много, если бы мне просто нужен был рабочий код я бы скопировал оттуда и вставил в свой проект. Я задаю вопрос чтобы понять что в моем коде неправильно...
Забыл упомянуть, i < 900; в коде это не ошибка, просто у меня входные изображения все 30х30
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
17.09.2017, 10:13
Цитата Сообщение от SoapMactavish Посмотреть сообщение
если бы мне просто нужен был рабочий код я бы скопировал оттуда и вставил в свой проект
просто посмотрите на чужой рабочий код, и найдите в своем коде ошибки
0
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
17.09.2017, 11:39
Там точно есть выравнивание какое-то по строкам, надо учитывать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.09.2017, 11:39
Помогаю со студенческими работами здесь

Преобразование из int в массив. Исправить ошибки
Здравствуйте. Задача:напишите программу преобразования значений переменной типа int,вводимого из стандартного потока, в массив из 12...

Преобразование массива строк в массив тип int
На вход идет строка (разбиваем ее сплитом) Нужно массив подстрок конвертировать в массив чисел через LINQ Я пока не знаю как это делать...

Преобразование табличных значений datagridview в массив типа int
ну собственно вопрос в заголовке. я примерно представляю что это два вложенных цикла, через метод конверт как то преобразуется, но все...

Как происходит преобразование int<<float<int
Как происходит преобразование int&lt;&lt;float&lt;int int n=222222222; float f=(float)n; n=(int)f; n== 222222224; Почему в итоге...

Преобразование IEnumerable<int> в int[]
Существуют два множества, представленные int. Необходимо найти их объединение, пересечение, вычитание. Для этого можно использовать...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru