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

Кривой вывод изображения в bmp-файле

28.05.2015, 18:19. Показов 2844. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
всем привет, при записывании информации в bmp-файл столкнулся со следующей проблемой(см.вложение):слева исходный bmp-файл, справа - то, что пытаюсь считать и записать в новый файл. в чем проблема не понимаю.
выравнивание байт поставил.

Изображение сохранял как 256-цветный рисунок.

IDE - Visual Studio 2013

Исходное изображение в прикрепленном архиве

подскажите, пожалуйста, в чем проблема!



Заголовочный файл
C++ (Qt)
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
#include <iostream>
#include <string>
using namespace std;
#ifndef bmpFile
#define bmpfile
#pragma pack(push)
#pragma pack(1)
typedef unsigned long DWORD; // Двойное слово - 32 бита (разряда)
typedef unsigned short WORD; // Слово - 16 бит (разрядов)
typedef signed long LONG;
typedef unsigned short UINT;
 
// Заголовок файла
typedef struct tagBITMAPFILEHEADER
{
    UINT bfType; // 'BM' = 4D42h
    DWORD bfSize;
    UINT bfReserved1;
    UINT bfReserved2;
    DWORD bfOffBits; // Смещение к растру
} BITMAPFILEHEADER;
 
// Заголовок Bitmap
typedef struct tagBITMAPINFOHEADER
{
    DWORD biSize;
    LONG biWidth;
    LONG biHeight;
    WORD biPlanes;
    WORD biBitCount;
    DWORD biCompression;
    DWORD biSizeImage;
    LONG biXPelsPerMeter;
    LONG biYPelsPerMeter;
    DWORD biClrUsed;
    DWORD biClrImportant;
    } BITMAPINFOHEADER;
 
typedef struct tagRGBQUAD
{
    char rgbBlue;
    char rgbGreen;
    char rgbRed;
    char rgbReserved;
} RGBQUAD;
 
class BMPFileHandler
{
    BITMAPFILEHEADER bitMapFileHeader;
    BITMAPINFOHEADER bitMapFileInfoHeader;
    RGBQUAD palette[256];
    char** image;
    public:
        void LoadFile(string fileName);
        void WriteFile(string fileName);
};
#pragma pack(pop)
#endif
.cpp-файл
C++ (Qt)
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
#include <iostream>
#include <string>
#include <fstream>
#include "bmpFile.h"
using namespace std;
 
void BMPFileHandler::LoadFile(string fileName)
{
    ifstream fileLoader(fileName);
    fileLoader.read((char*)&bitMapFileHeader, sizeof (BITMAPFILEHEADER));
    fileLoader.read((char*)&bitMapFileInfoHeader, sizeof (BITMAPINFOHEADER));
    
    for (unsigned i = 0; i < 256; i++)
        fileLoader.read((char*)&palette[i], sizeof(RGBQUAD));
    
    image = new char*[bitMapFileInfoHeader.biWidth];
    for (unsigned i = 0; i < bitMapFileInfoHeader.biHeight; i++)
        image[i] = new char[bitMapFileInfoHeader.biWidth];
 
 
    for (unsigned i = 0; i < bitMapFileInfoHeader.biHeight; i++)
        for (unsigned j = 0; j < bitMapFileInfoHeader.biWidth; j++)
            fileLoader.read((char*)&image[i][j], sizeof(char));
 
    fileLoader.close();
}
 
void BMPFileHandler::WriteFile(string fileName)
{
    ofstream fileWriter(fileName);
    fileWriter.write((char*)&bitMapFileHeader, sizeof (BITMAPFILEHEADER));
    fileWriter.write((char*)&bitMapFileInfoHeader, sizeof (BITMAPINFOHEADER));
    for (unsigned i = 0; i < bitMapFileInfoHeader.biHeight; i++)
        fileWriter.write((char*)&palette[i], sizeof(RGBQUAD));
 
    for (unsigned i = 0; i < bitMapFileInfoHeader.biHeight; i++)
        for (unsigned j = 0; j < bitMapFileInfoHeader.biWidth; j++)
            fileWriter.write((char*)&image[i][j], sizeof(char));
    fileWriter.close();     
}
Миниатюры
Кривой вывод изображения в bmp-файле  
Вложения
Тип файла: rar barcelona-256.rar (4.3 Кб, 17 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.05.2015, 18:19
Ответы с готовыми решениями:

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

Выравнивание в bmp файле
Загружаю bitmap файл, но вот, если его кол-во байт в строке не кратно 4, то дописывается мусор в...

Как происходит изменение разрешения изображения (bmp)
Мне нужно изменить разрешение изображения файла bmp, но я не понимаю как выбирается цвет для новых...

Теория рисования в bmp файле
Доброе время суток! Никак не получается найти теорию по тому, как рисовать в bmp файле с...

12
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
28.05.2015, 18:55 2
Насколько я помню, длина строки в BMP файле должна быть кратна четырём.
0
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 15
28.05.2015, 18:57  [ТС] 3
Цитата Сообщение от castaway Посмотреть сообщение
Насколько я помню, длина строки в BMP файле должна быть кратна четырём.
это касается строк, в которых сами пиксели хранятся?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
28.05.2015, 19:01 4
Цитата Сообщение от Vadim352 Посмотреть сообщение
это касается строк, в которых сами пиксели хранятся?
А там есть какие-то другие строки?
0
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 15
28.05.2015, 19:04  [ТС] 5
Цитата Сообщение от castaway Посмотреть сообщение
А там есть какие-то другие строки?
ширина изображения - 220 пикселей. соответственно выделяю строку тоже размером в 220 символов
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
28.05.2015, 19:16 6
Ну тогда проблем нет!

Могу лишь подсказать как немного оптимизировать программу, заменив двойной цикл записи на одну строку:
C++
1
fileWriter.write( (char *)&image[0][0], bitMapFileInfoHeader.biWidth * bitMapFileInfoHeader.biHeight );
0
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 15
28.05.2015, 19:19  [ТС] 7
Цитата Сообщение от castaway Посмотреть сообщение
Ну тогда проблем нет!
Могу лишь подсказать как немного оптимизировать программу, заменив двойной цикл записи на одну строку:
я и так пробовал, и по-всякому пробовал. однако результат не меняется(
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
28.05.2015, 19:21 8
А он и не должен измениться, эта строка лишь упрощает алгоритм, а не решает проблему.
Без полного кода проблема не решится.
0
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 15
28.05.2015, 19:25  [ТС] 9
Цитата Сообщение от castaway Посмотреть сообщение
Без полного кода проблема не решится.
код функции main
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <fstream>
#include <string>
#include "bmpFile.h"
using namespace std;
 
void main()
{
    setlocale (0,"");
    BMPFileHandler handler;
    handler.LoadFile("barcelona-256.bmp");
    handler.WriteFile("barcelona-256-new.bmp");
    system("pause");
}
весь остальной код в первом посте
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
28.05.2015, 19:44 10
В чём проблема пока не знаю, но знаю следующее:
В 16-й строке исправь ошибку, там должно быть biHeight.
В 33-й должно быть 256.
0
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 15
28.05.2015, 19:47  [ТС] 11
Цитата Сообщение от castaway Посмотреть сообщение
В 16-й строке исправь ошибку, там должно быть biHeight.
исправил
Цитата Сообщение от castaway Посмотреть сообщение
В 33-й должно быть 256.
этого не понял, потому что в 33 строке объявляется цикл for
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
28.05.2015, 19:48 12
А вот и решение самой главной проблемы:
C++
1
2
3
    ifstream fileLoader( fileName, ios_base::in | ios_base::binary );
    ...
    ofstream fileWriter( fileName, ios_base::out | ios_base::binary );
Добавлено через 41 секунду
Цитата Сообщение от Vadim352 Посмотреть сообщение
этого не понял, потому что в 33 строке объявляется цикл for
Вместо bitMapFileInfoHeader.biHeight должно быть 256.
0
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 15
28.05.2015, 19:53  [ТС] 13
castaway, спасибо за помощь!
0
28.05.2015, 19:53
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.05.2015, 19:53
Помогаю со студенческими работами здесь

Как расшифровать цвета bmp изображения без таблицы?
Здравствуйте. Прочитанный мною файл bmp имеет следующий заголовок InfoHeader ...

Контрастирование, прореживание, построение гистограммы tiff изображения и переформатирование в bmp формат
Ребят , кто может , отзовитесь!!! Срочно нужна помощь знающих людей! В этой программе прореживание...

Написать программу которая будет выдавать информацию о BMP файле
Нужно узнать - ширина изображения, в пикселях; - высота изображения, в пикселях; - глубина...

Запись чёрно-белого изображения bmp в двумерный массив и его сжатие/разжатие по Хаффману
Помогите, у меня задание: есть картинка (чёрно-белое изображение бмп) её необходимо записать в...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Блоги программистов
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
Полезные поделки на Arduino, которые можно сделать самому
raxper 06.01.2025
Arduino как платформа для творчества Arduino представляет собой удивительную платформу для технического творчества, которая открывает безграничные возможности для создания уникальных проектов. Эта. . .
Подборка решений задач на Python
IT_Exp 06.01.2025
Целью данной подборки является предоставление возможности ознакомиться с различными задачами и их решениями на Python, что может быть полезно как для начинающих, так и для опытных программистов. . . .
С чего начать программировать микроконтроллер­­ы
raxper 06.01.2025
Введение в мир микроконтроллеров Микроконтроллеры стали неотъемлемой частью современного мира, окружая нас повсюду: от простых бытовых приборов до сложных промышленных систем. Эти маленькие. . .
Из чего собрать игровой компьютер
inter-admin 06.01.2025
Сборка игрового компьютера требует особого внимания к выбору комплектующих и их совместимости. Правильно собранный игровой ПК не только обеспечивает комфортный геймплей в современных играх, но и. . .
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного сумматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(аси­­­­­­­­­­­­­­­­­­­­х­р­о­н­н­ы­й счётчик с управляющим сигналом задержки).
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru