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

Работа с .bmp файлами

25.05.2017, 12:28. Показов 1401. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, нужно увеличить размер .bmp картинки в n раз. Код не обработан, всё находится в Main.
Проблема в том, что при вводе n>=2 получаю картинку, которая подходит по размеру, но сама картинка расплывается в непонятный набор пикселей
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
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
// ConsoleApplication10.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include "iostream"
#include "cstdio"
#include <stdio.h>
#include <cstdint>
 
using namespace std;
 
typedef struct {
    int8_t id[2];            // Завжди дві літери 'B' і 'M'
    int32_t filesize;        // Розмір файла в байтах                                         потрібна
    int16_t reserved[2];     // 0, 0
    int32_t headersize;      // 54L для 24-бітних зображень
    int32_t infoSize;        // 40L для 24-бітних зображень
    int32_t width;           // ширина зображення в пікселях                                   потрібна
    int32_t depth;           // висота зображення в пікселях                                   потрібна
    int16_t biPlanes;        // 1 (для 24-бітних зображень)
    int16_t bits;            // 24 (для 24-бітних зображень)
    int32_t biCompression;   // 0L
    int32_t biSizeImage;     // Можна поставити в 0L для зображень без компрессії (наш варіант)
    int32_t biXPelsPerMeter; // Рекомендована кількість пікселів на метр, можна 0L
    int32_t biYPelsPerMeter; // Те саме, по висоті
    int32_t biClrUsed;       // Для індексованих зображень, можна поставити 0L
    int32_t biClrImportant;  // Те саме
} BMPHEAD;
BMPHEAD bh, nh;               //Заголовки вхідного та вихідного файлів
typedef struct {
    int8_t redComponent;
    int8_t greenComponent;
    int8_t blueComponent;   //BGR
} PIXELDATA;
PIXELDATA px, helper;
 
int main() {
    FILE *f = fopen("D:\\input.bmp", "rb");
    FILE *newf = fopen("D:\\output.bmp", "wb");
    fread(&bh.id, sizeof(int8_t), 2, f);
    fread(&bh.filesize, sizeof(int32_t), 1, f);
    fread(&bh.reserved, sizeof(int16_t), 2, f);
    fread(&bh.headersize, sizeof(int32_t), 1, f);
    fread(&bh.infoSize, sizeof(int32_t), 1, f);
    fread(&bh.width, sizeof(int32_t), 1, f);
    fread(&bh.depth, sizeof(int32_t), 1, f);
    fread(&bh.biPlanes, sizeof(int16_t), 1, f);
    fread(&bh.bits, sizeof(int16_t), 1, f);
    fread(&bh.biCompression, sizeof(int32_t), 1, f);
    fread(&bh.biSizeImage, sizeof(int32_t), 1, f);
    fread(&bh.biXPelsPerMeter, sizeof(int32_t), 1, f);
    fread(&bh.biYPelsPerMeter, sizeof(int32_t), 1, f);
    fread(&bh.biClrUsed, sizeof(int32_t), 1, f);
    fread(&bh.biClrImportant, sizeof(int32_t), 1, f);
    nh = bh;
    int n;
    cout << "V skolko raz uvelichit:"; cin >> n;
    nh.width = nh.width*n;
    nh.depth = nh.depth*n;
    int bytesPerLine;
    bytesPerLine = nh.width * 3;
    if (bytesPerLine & 0x0003)
    {
        bytesPerLine |= 0x0003;
        ++bytesPerLine;
    }
    nh.filesize = nh.headersize + (long)bytesPerLine*nh.depth;
    fwrite(&nh.id, sizeof(int8_t), 2, newf);
    fwrite(&nh.filesize, sizeof(int32_t), 1, newf);
    fwrite(&nh.reserved, sizeof(int16_t), 2, newf);
    fwrite(&nh.headersize, sizeof(int32_t), 1, newf);
    fwrite(&nh.infoSize, sizeof(int32_t), 1, newf);
    fwrite(&nh.width, sizeof(int32_t), 1, newf);
    fwrite(&nh.depth, sizeof(int32_t), 1, newf);
    fwrite(&nh.biPlanes, sizeof(int16_t), 1, newf);
    fwrite(&nh.bits, sizeof(int16_t), 1, newf);
    fwrite(&nh.biCompression, sizeof(int32_t), 1, newf);
    fwrite(&nh.biSizeImage, sizeof(int32_t), 1, newf);
    fwrite(&nh.biXPelsPerMeter, sizeof(int32_t), 1, newf);
    fwrite(&nh.biYPelsPerMeter, sizeof(int32_t), 1, newf);
    fwrite(&nh.biClrUsed, sizeof(int32_t), 1, newf);
    fwrite(&nh.biClrImportant, sizeof(int32_t), 1, newf);
    int j = 0;
    while (j < nh.depth)
    {
        int help = 0;
        while (help<nh.width) {
            fread(&px, sizeof(PIXELDATA), 1, f);
            for (int i = 0; i < n; i++)
            {
                fwrite(&px, sizeof(PIXELDATA), 1, newf);
                help++;
            }
        }
        size_t padding = 0;
        if ((nh.width * 3) % 4) padding = 4 - (nh.width * 3) % 4;
        for (size_t t = 0; t < padding; ++t) {
            fread(&px, sizeof(px), 1, f);
            fwrite(&px, sizeof(px), 1, newf);
        }
 
        for (int m = 1;m < n;m++)
        {
            fseek(f, 54 + bh.width * j, SEEK_SET);
            int l = 0;
            while (l<nh.width)
            {
                fread(&px, sizeof(PIXELDATA), 1, f);
                for (int i = 0; i < n; i++)
                {
                    fwrite(&px, sizeof(PIXELDATA), 1, newf);
                    l++;
                }
            }
            if ((nh.width * 3) % 4) padding = 4 - (nh.width * 3) % 4;
            for (size_t t = 0; t < padding; ++t) {
                fread(&px, sizeof(px), 1, f);
                fwrite(&px, sizeof(px), 1, newf);
            }
        }
        j++;
    }
    system("PAUSE");
    return 0;
}
Добавлено через 1 час 0 минут
Возможно для выравнивающих битов лучше использовать ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 if (((nh.width * 3) % 4) != 0)
        {
        int Q = ((nh.width * 3) % 4);
        for (int s = 0;s < (4 - Q);s++)
        {
        fputc(0x00, newf);
        }
 
вместо 
 
size_t padding = 0;
        if ((nh.width * 3) % 4) padding = 4 - (nh.width * 3) % 4;
        for (size_t t = 0; t < padding; ++t) {
            fread(&px, sizeof(px), 1, f);
            fwrite(&px, sizeof(px), 1, newf);
        }
Добавлено через 17 часов 11 минут
Проблема решена, заключалась в том, что при считывании не вспомогательные биты, которые добавляются, если кол-во байт в строке не кратна 4. Так же изменена формула добавления тех самых битов в новый файл.
Тема закрыта(знать бы, как её закрыть)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.05.2017, 12:28
Ответы с готовыми решениями:

Работа с BMP-файлами (класс "8 битное BMP изображение)
Написать класс &quot;8 битное BMP изображение&quot;.Класс должен содержать 3 конструктора: конструктор по умолчанию, конструктор с параметрами и...

Работа с файлами BMP формата
Привет. Такая ситуация... Нужно считать (именно &quot;вручную&quot;) файл bmp формата в объект класса. При этом если в объект ничего не считано то он...

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

1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
25.05.2017, 12:39
Цитата Сообщение от Belphego Посмотреть сообщение
Тема закрыта(знать бы, как её закрыть)
Темы по просьбам пользователей не закрываются и не удаляются.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.05.2017, 12:39
Помогаю со студенческими работами здесь

Как работать с BMP-файлами
Помогите разобраться, как с помощью Turbo Pascal 7.0 без использования модулей специальных, кроме Crt, работать с bmp файлами. Хотя бы...

Работа с файлами , хотелось бы с windows system файлами
всем привет, нужна интересная идея по программированию, работа с файлами , хотелось бы с windows system файлами, у вас есть какая-то идея?...

Работа с BMP
Здравствуйте! Требуется написать просмотрщик bmp с возможностью приближения и пролистывания картинки. Подскажите схему реализации данной...

Работа с BMP
Занес файл 1.bmp в массив var a: array of TRGBTriple; bmp: TBitMap; size: dword; begin bmp:=TBitMap.Create; ...

работа с BMP
задача: написать программу наложения изображений одинакового размера друг на друга, при этом из интерфейса пользователя необходимо...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru