0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 15
1

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

28.05.2015, 18:19. Показов 2801. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.05.2015, 19:53
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru