С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

Открытие и запись файла bmp. Что здесь не так ? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Последовательность положительных элементов наибольшей длины http://www.cyberforum.ru/cpp-beginners/thread1126283.html
Добрый вечер) Нужно открыть двоичный файл и в нем найти последовательность положительных элементов наибольшей длины (ну и вывести ее и записать в обычный текстовый файл). Длина этой...
C++ Не работает условие void IsInclude(Shape* s1, Shape* s2) // включение объектов { s1->GetM(); s2->GetM(); if ( s1->minx< s2->minx && s1->miny< s2->miny && s1->maxx> s2->maxx && s1->maxx> s2->maxx ) cout <<... http://www.cyberforum.ru/cpp-beginners/thread1126275.html
C++ Инвертирование содержимого файла
Здравствуйте! Скажите как модно реализовать инвертирование содержимого файла! Причем нужно инвертировать не по одному символу, а целыми блоками! Например: Петров 12 4 Иванов 13 5...
C++ Не считает sin
#include <iostream> #include <stdio.h> #include <math.h> #include <conio.h> using namespace std; float a,b,y,s; int main() { cout <<"vedite dliny ctoronu :"; cin>>a; cout <<"vedite ...
C++ Запись элементов массива структурного типа.Из старого массива- в новый http://www.cyberforum.ru/cpp-beginners/thread1126240.html
Здравствуйте.Возможно, в названии темы не совсем понятно "чего я хочу", поэтому напишу задание: "1.Сформировать динамический массив из элементов структурного типа. Структурный тип определен в...
C++ Составить программу, которая вычисляет площадь кольца Арифметика: Z=cosα+ cos2α+ cos6α+ cos7α Текст: Составить программу, которая вычисляет площадь кольца. Внешний и внутренний радиус вводятся с клавиатуры. Заранее спасибо! подробнее

Показать сообщение отдельно
mariko_11
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64

Открытие и запись файла bmp. Что здесь не так ? - C++

21.03.2014, 23:33. Просмотров 924. Ответов 5
Метки (Все метки)

Имеется программа, копирующая содержимое из указанного bmp в файл result. Проблема: файл stars копируется нормально, а вместо скопированного tank получается какая-то ерунда. Почему ?

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
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <iostream>
 
using namespace std;
 
typedef struct pixel {
    char red;
    char green;
    char blue;
 
} pixel_t;
 
typedef struct pixel_array {
    pixel_t **array_of_pixel;
    long height;
    long width;
 
} pixel_array_t;
 
typedef struct tagBITMAPFILEHEADER {
    unsigned short    bfType;
    unsigned long     bfSize;
    unsigned short    bfReserved1;
    unsigned short    bfReserved2;
    unsigned long     bfOffBits;
} BITMAPFILEHEADER;
 
typedef struct tagBITMAPINFOHEADER {
    unsigned long biSize;
    unsigned long biWidth;
    unsigned long biHeight;
    unsigned short  biPlanes;
    unsigned short  biBitCount;
    unsigned long biCompression;
    unsigned long biSizeImage;
    long  biXPelsPerMeter;
    long  biYPelsPerMeter;
    unsigned long biClrUsed;
    unsigned long biClrImportant;
} BITMAPINFOHEADER;
 
const int MAX_PATH_LEN = 260;
 
void parse_file(FILE *file, pixel_array_t *pix_arr, BITMAPFILEHEADER &header, BITMAPINFOHEADER &info_header) {
 
    unsigned long image_size = 0;
    long height = 0;
    long width = 0;
 
    // Читаем первую структуру (BITMAPFILEHEADER)
    fread(&header.bfType, 1, sizeof(header.bfType), file);
    fread(&header.bfSize, 1, sizeof(header.bfSize), file);
    fread(&header.bfReserved1, 1, sizeof(header.bfReserved1), file);
    fread(&header.bfReserved2, 1, sizeof(header.bfReserved2), file);
    fread(&header.bfOffBits, 1, sizeof(header.bfOffBits), file); // Нам нужно это поле
 
 
    cout << hex << "bfType = " << "0x" << header.bfType << endl;
    cout << hex << "bfSize = " << "0x" << header.bfSize << endl;
    cout << hex << "bfOffBits = " << "0x" << header.bfOffBits << endl;
 
    // Читаем вторую структуру (BITMAPINFOHEADER) чтобы узнать размер буфера пикселей
    fread(&info_header, 1, sizeof(info_header), file);
    cout << "biWidth = " << info_header.biWidth << endl;
    cout << "biHeight = " << info_header.biHeight << endl;
 
    if (info_header.biSizeImage == 0) { // Если это поле оказалось нулевым
        image_size = info_header.biWidth * 3 + info_header.biWidth % 4;
        image_size *= info_header.biHeight; // считаем вручную
    } else {
        image_size = info_header.biSizeImage; // иначе - берем как есть
    }
 
    cout << "size = " << image_size << endl;
 
    fseek(file, header.bfOffBits, SEEK_SET); // Смещаемся к буферу пикселей
    //fread(array_of_pixel, image_size, 1, file); // Читаем
 
    // Заводим двухмерный массив под структуры пикселя
    pix_arr->height = height = info_header.biHeight;
    pix_arr->width = width = info_header.biWidth;
    pix_arr->array_of_pixel = new pixel_t *[width];
    for (int i = 0; i < width; ++i) {
        pix_arr->array_of_pixel[i] = new pixel_t[height];
    }
 
    //задаем значения массиву
    for (int i = 0; i < width; ++i) {
        for (int j = 0; j < height ; ++j)
            fread(&pix_arr->array_of_pixel[i][j], sizeof(pixel_t), 1, file);
    }
 
}
 
void create_image(const char *name, pixel_t **pixels, int width, int height, BITMAPFILEHEADER &header, BITMAPINFOHEADER &info_header) {
    FILE *f;
 
    f = fopen(name, "wb");
    fwrite(&header.bfType, sizeof(header.bfType), 1, f);
    fwrite(&header.bfSize, sizeof(header.bfSize),1, f);
    fwrite(&header.bfReserved1, sizeof(header.bfReserved1),1, f);
    fwrite(&header.bfReserved2, sizeof(header.bfReserved2),1, f);
    fwrite(&header.bfOffBits, sizeof(header.bfOffBits),1, f);
 
    fwrite(&info_header, sizeof(info_header), 1, f);
 
    for(int i = 0; i < width; ++i) {
        for (int j = 0; j < height; ++j) {
            unsigned char pix [] = {pixels[i][j].red, pixels[i][j].green, pixels[i][j].blue};
            //unsigned char pix [] = {0, 0, (char)pixels[i][j]};
            fwrite(pix, 1, 3, f);
        }
    }
    fclose(f);
}
 
 
int main()
{
    char file_path[MAX_PATH_LEN] = "tank.bmp";
    pixel_array_t arr_info = {NULL, 0, 0}; // Массив структур пикселя.
 
    FILE *bmp_file;
 
    bmp_file = fopen(file_path, "r");
    if (bmp_file == NULL) {
        cout << "Error, file not found" << endl;
        return -1;
    }
 
    BITMAPFILEHEADER header; BITMAPINFOHEADER info_header;
 
    parse_file(bmp_file, &arr_info, header, info_header);
 
    cout << "w = " << arr_info.width << " h = " << arr_info.height << endl;
 
    create_image("result.bmp", arr_info.array_of_pixel, arr_info.width, arr_info.height, header, info_header);
 
    fclose(bmp_file);
 
 
    cout << "finished" << endl;
 
    return 0;
}
0
Вложения
Тип файла: zip bmp.zip (90.9 Кб, 13 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.