Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Последовательность положительных элементов наибольшей длины http://www.cyberforum.ru/cpp-beginners/thread1126283.html
Добрый вечер) Нужно открыть двоичный файл и в нем найти последовательность положительных элементов наибольшей длины (ну и вывести ее и записать в обычный текстовый файл). Длина этой последовательности вроде бы находится, но как вывести саму эту последовательность? Прошу помощи)) Код: #include <iostream> using namespace std; int main() { FILE *f; int i,n, *a,max,k; k=0; ...
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 << s1->ID << "включает в себя" << s2->ID; if ( s2->minx< s1->minx && s2->miny< s1->miny && s2->maxx> s1->maxx && s2->maxx> s1->maxx ) cout << s2->ID << "включает в себя" << s1->ID; ... http://www.cyberforum.ru/cpp-beginners/thread1126275.html
C++ Инвертирование содержимого файла
Здравствуйте! Скажите как модно реализовать инвертирование содержимого файла! Причем нужно инвертировать не по одному символу, а целыми блоками! Например: Петров 12 4 Иванов 13 5 Сидоров 14 3 После инвертирования, при выводе содержимого файла должно получится: Сидоров 14 3 Иванов 13 5 Петров 12 4
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 dliny ctoronu :"; cin>>b;
C++ Запись элементов массива структурного типа.Из старого массива- в новый http://www.cyberforum.ru/cpp-beginners/thread1126240.html
Здравствуйте.Возможно, в названии темы не совсем понятно "чего я хочу", поэтому напишу задание: "1.Сформировать динамический массив из элементов структурного типа. Структурный тип определен в варианте. 2.Распечатать сформированный массив. 3.Выполнить поиск элементов в массиве, удовлетворяющих заданному в варианте условию и сформировать из них новый массив. 4.Распечатать полученный...
C++ Составить программу, которая вычисляет площадь кольца Арифметика: Z=cosα+ cos2α+ cos6α+ cos7α Текст: Составить программу, которая вычисляет площадь кольца. Внешний и внутренний радиус вводятся с клавиатуры. Заранее спасибо! подробнее

Показать сообщение отдельно
mariko_11
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
21.03.2014, 23:33     Открытие и запись файла bmp. Что здесь не так ?
Имеется программа, копирующая содержимое из указанного 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;
}
Вложения
Тип файла: zip bmp.zip (90.9 Кб, 10 просмотров)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 18:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru