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

Загрузка bitmap файла

31.12.2016, 15:20. Показов 5335. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как побайтово загрузить bitmap-файл, для дальнейшей работы с ним (сравнение цветов и т.п.) в массив?
Пытался как то так:
C++
1
2
3
4
file.open(path, std::ios::binary);
 
while(!file.eof())
        fileMap.push_back(file.get());
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.12.2016, 15:20
Ответы с готовыми решениями:

Ручная загрузка изображения BITMAP из файла
Здравствуйте коллеги! Помогите пожалуйста разобраться с загрузкой BITMAP изображения. Изображение не рисуется. Пробовал по всякому и с...

Загрузка картинок с сервера YouTube; нет доступа к содержимому файла Bitmap, BitmapData
Всем привет! Расширяю функционал своего плеера для воспроизведения видеороликов с YouTube. Потребовалось реализовать функцию...

Загрузка Bitmap в окно
Добрый день! Тренируюсь писать на WinAPI в IDE VS 2013 Попытался загрузить Bitmap через WinAPI. Вроде код написан верно. Программа...

12
114 / 112 / 62
Регистрация: 15.03.2013
Сообщений: 561
Записей в блоге: 5
31.12.2016, 16:54
uner3213,
C++
1
2
3
4
5
6
7
8
9
10
    BITMAPFILEHEADER bmpFH;
    BITMAPINFOHEADER bmpIH;
    ....
    FILE *f;        
    fopen_s(&f, filename, "rb");
        // Если указанного файла нет, то возвращаем 0;
    if (f == NULL) return 0;
    fread(&bmpFH, sizeof(bmpFH), 1, f); // Загрузка BITMAPFILEHEADER
    fread(&bmpIH, sizeof(bmpIH), 1, f); // Загрузка BITMAPINFOHEADER
    ....
Далее я загружал оставшиеся данные в массив байт и потом заполнял массив структур. (RGBTRIPLE или RGBQUAD)

Добавлено через 3 минуты
Мне по заданию правда нужно было класс Image написать для работы с файлами bitmap.
0
0 / 0 / 0
Регистрация: 08.11.2015
Сообщений: 28
02.01.2017, 00:23  [ТС]
Уже со всем разобрался. Реализовал все иначе:
Считываю только размер файла и отступ до самого битамапа, после чего в цикле записываю цвета.

если кому интересно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        TCHAR *buff = new TCHAR[4];
    file.seekg(2);
    file.read(&buff[0], 4);
 
    unsigned long int SizeMap = buff[0];
    
    file.seekg(10);
    file.read(&buff[0], 4);
    unsigned long int OffsetToPixMap = buff[0];
 
    file.seekg(OffsetToPixMap);
    std::vector <RGBMap> RGBMapV;
    const int fI = SizeMap - OffsetToPixMap;
 
    for(int i = 0; i < fI; i++)
    {
        file.read(&buff[0], 3);
        RGBMapV.push_back({ buff[0], buff[1], buff[2] });
    }
Интересно только вот в этих моментах:
unsigned long int OffsetToPixMap = buff[0]; unsigned long int SizeMap = buff[0];
правильно ли это?

Добавлено через 3 часа 0 минут
Так, еще немного покопавшись, я понял, что не так. читать по несколько байт с помощью read - нельзя. Поэтому, стал использовать fread и FILE, соответственно, однако остался вопрос: есть ли альтернатива fread, для fstream'а, где более адекватно считываются данные, нежели, чем в массив символов?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
02.01.2017, 00:41
Цитата Сообщение от uner3213 Посмотреть сообщение
читать по несколько байт с помощью read - нельзя.
Почему? Откуда такой вывод?
0
0 / 0 / 0
Регистрация: 08.11.2015
Сообщений: 28
02.01.2017, 00:54  [ТС]
ну вот, к примеру, мне надо прочитать 0 и 1 байт. в нулевом 42, в первом 4D. Если читать с помощью read, то он запишет в аргумент два символа, под номером 42 и под номером 4D, когда fread, нормально: число 4D42. Я ошибаюсь?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
02.01.2017, 01:01
Цитата Сообщение от uner3213 Посмотреть сообщение
то он запишет в аргумент
В какой аргумент? Имеешь ввиду, что порядок байт меняется?
0
0 / 0 / 0
Регистрация: 08.11.2015
Сообщений: 28
02.01.2017, 01:14  [ТС]
да и не только:
смотри, вот допустим, мы читаем file.read(&buff[0], 2);
в buff записалось:
buff[0] = 42;
buff[1] = 4D;
и с этим потом крайне сложно работать, надо будет делать лишние действия, чтобы преобразовать в 4D42 (склеить 4D и 42, перед этим вернув из 10-ричной в 16-ричную, потом обратно)
когда как, если использовать
readf(&buff, 1, 2, f);
он нормально запишет:
buff = 0xcccccccccccc4d42;
и ни каких лишних действий.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
02.01.2017, 01:30
Цитата Сообщение от uner3213 Посмотреть сообщение
да и не только:
Что fread, что read читают байты одинаково, порядок байт, при чтении из файла, не меняют. Как байты в файле расположены, так они и будут считаны.
Миниатюры
Загрузка bitmap файла  
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
02.01.2017, 01:42
Я понял. У тебя юникод включен, и читаешь ты не в char, а в TCHAR. В памяти (можешь посмотреть в отладчике) по прежнему 424D, но показывать (и выводить) будет как коды юникода.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
02.01.2017, 01:48
...
Миниатюры
Загрузка bitmap файла  
0
0 / 0 / 0
Регистрация: 08.11.2015
Сообщений: 28
02.01.2017, 03:30  [ТС]
как раз таки, когда я юзаю FILE, все работает, а вот с помощью fstream-а, не совсем понял. в любом случае, я уже сделал то, что мне надо было:
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
struct RGBMapSet
{
    unsigned long R;
    unsigned long G;
    unsigned long B;
};
 
#define FILE_NOT_EXIST -1
#define FILE_NOT_BITMAP -2
#define FILE_NOT_RGB32 -3
 
int BitMapRGBLoad(TCHAR *path, long &w, long &h, std::vector<RGBMapSet> &mapVector)
{
    FILE *f;
    _tfopen_s(&f, path, __T("rb"));
 
    if(f)
    {
        unsigned short bfType = 0;
        fread(&bfType, 1, 2, f);
        if((bfType == 0x4d42) | (bfType == 0x424d))
        {
            fseek(f, 0x12, SEEK_SET);
            fread(&w, 1, 4, f);
            fread(&h, 1, 4, f);
            fseek(f, 0x1c, SEEK_SET);
            unsigned short biBitCount = 0;
            fread(&biBitCount, 1, 2, f);
            if (biBitCount == 0x18) {
                fseek(f, 0x0a, SEEK_SET);
                unsigned long bfOffBits = 0;
                fread(&bfOffBits, 1, 4, f);
                fseek(f, bfOffBits, SEEK_SET);
                unsigned long buffMask = 0;
                unsigned int counter = 0;
 
                while (true)
                {
                    fread(&buffMask, 1, 1, f);
 
                    if (feof(f))
                        break;
                    else
                        mapVector.push_back(RGBMapSet());
                    mapVector[counter].B = buffMask;
 
                    fread(&buffMask, 1, 1, f);
                    mapVector[counter].G = buffMask;
 
                    fread(&buffMask, 1, 1, f);
                    mapVector[counter].R = buffMask;
 
                    counter++;
                }
 
                fclose(f);
                return 1;
            }
            else 
            {
                fclose(f);
                return FILE_NOT_RGB32;
            }
        }
        else {
            fclose(f);
            return FILE_NOT_BITMAP;
        }
    }
    else {
        fclose(f);
        return FILE_NOT_EXIST;
    }
}
оставлю тут.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
02.01.2017, 03:45
Цитата Сообщение от uner3213 Посмотреть сообщение
как раз таки, когда я юзаю FILE, все работает
Работает, не работает... Разговор не об этом.
Цитата Сообщение от nd2 Посмотреть сообщение
Что fread, что read читают байты одинаково, порядок байт, при чтении из файла, не меняют. Как байты в файле расположены, так они и будут считаны.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.01.2017, 03:45
Помогаю со студенческими работами здесь

Загрузка изображение в Bitmap
Как правильно загрузит картинку в Bitmap?? Bitmap BT = new Bitmap(@&quot;C:\box.png&quot;); так не получается (

Загрузка изображения Bitmap
Здравствуйте. Можно ли загружать два и более изображения в один объект, или все таки под каждое изображение нужно делать свой объект?

Загрузка Bitmap в диалоговое окно
Господа, возникла следующая проблема. Создаю диалоговое окно с помощью файла ресурсов. При открытии программой стороннего bitmap...

Загрузка BitMap в память System.AccessViolationException
Всем привет! Какая проблема: Есть набор Bitmap'ов и для быстрого переноса значений цветов в массив я использую запись массива битов в...

Загрузка картинки из ресурсов в Bitmap. Android 4.1.1
Добрый вечер. Дело заключается в следующем: я загружаю картинку из ресурсов (png) в Bitmap таким образом: ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 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