Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 16.10.2019
Сообщений: 77
1

Сжатие bmp файлов на с++

17.02.2020, 18:04. Показов 730. Ответов 3

Нужно через манипуляции с палитрой привести исходный код к соотношению 8 к 1 пикселей. Как это сделать я не понимаю
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
#include <windows.h>
#include <iostream>
#include <string>
 
using namespace std;
 
void main()
{
    string sFileName;
    BITMAPFILEHEADER bmpFileHeader;
    BITMAPINFOHEADER bmpInfoHeader;
    int Width, Height;
    RGBQUAD Palette[256];
    RGBTRIPLE *inBuf;
    BYTE *outBuf;
    HANDLE hInputFile, hOutFile;
    DWORD RW;
 
    cout << "Enter the full name, please: ";
    cin >> sFileName;
 
    hInputFile = CreateFile(sFileName.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
    if (hInputFile == INVALID_HANDLE_VALUE)
    {
        cout << "incorrect filename " << endl;
        return;
    }
        
    hOutFile = CreateFile("Result.bmp", GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL);
    if (hOutFile == INVALID_HANDLE_VALUE)
    {
        CloseHandle(hInputFile);
        cout << "Result.bmp already exists" << endl;
        return;
    }
 
    // Считываем инфу
    ReadFile(hInputFile, &bmpFileHeader, sizeof(bmpFileHeader), &RW, NULL);
    ReadFile(hInputFile, &bmpInfoHeader, sizeof(bmpInfoHeader), &RW, NULL);
 
    // Установим указатель на начало растра
    SetFilePointer(hInputFile, bmpFileHeader.bfOffBits, NULL, FILE_BEGIN);
    Width = bmpInfoHeader.biWidth;
    Height = bmpInfoHeader.biHeight;
 
    // Выделим память
    inBuf = new RGBTRIPLE[Width];
    outBuf = new BYTE[Width];
 
    // Заполним заголовки
    bmpFileHeader.bfOffBits = sizeof(bmpFileHeader) + sizeof(bmpInfoHeader) + 1024;
    bmpInfoHeader.biBitCount = 8;
    bmpFileHeader.bfSize = bmpFileHeader.bfOffBits + Width * Height + Height * (3 * Width % 4);
 
    // Запишем заголовки
    WriteFile(hOutFile, &bmpFileHeader, sizeof(bmpFileHeader), &RW, NULL);
    WriteFile(hOutFile, &bmpInfoHeader, sizeof(bmpInfoHeader), &RW, NULL);
    // Палитра черно-белая
    for (int i = 0; i < 256; i++)
    {
        Palette[i].rgbBlue = i;
        Palette[i].rgbGreen = i;
        Palette[i].rgbRed = i;
    }
    WriteFile(hOutFile, Palette, 256 * sizeof(RGBQUAD), &RW, NULL);
 
    // Начнем преобразовывать
    for (int i = 0; i < Height; i++)
    {
        ReadFile(hInputFile, inBuf, sizeof(RGBTRIPLE) * Width, &RW, NULL);
        for (int j = 0; j < Width; j++)
            outBuf[j] = 0.3*inBuf[j].rgbtRed + 0.59*inBuf[j].rgbtGreen + 0.11*inBuf[j].rgbtBlue;
 
        WriteFile(hOutFile, outBuf, sizeof(BYTE) * Width, &RW, NULL);
 
        // Пишем мусор для выравнивания
        //WriteFile(hOutFile, Palette, (3 * Width) % 4, &RW, NULL);
        //SetFilePointer(hInputFile, Width % 4, NULL, FILE_CURRENT);
    }
 
    delete[] inBuf;
    delete[] outBuf;
    CloseHandle(hInputFile);
    CloseHandle(hOutFile);
 
    cout << "Updating has come to the end successfully!";
    system("pause");
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.02.2020, 18:04
Ответы с готовыми решениями:

Сжатие bmp файла методом Шеннона-Фано
Помогите переделать код под .bmp файл

Сжатие и расжатие изображения .bmp благодаря алгоритмам JPEG/JPEG2000
Доброго времени суток! У меня по сути есть программа в которой открывается изображение формата BMP...

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

Сжатие файлов
Здравствуйте) Скажите пожалуйста, как можно сжать zip (rar) архивы и папки? То есть памяти на...

3
2087 / 654 / 243
Регистрация: 10.02.2018
Сообщений: 1,524
17.02.2020, 19:14 2
eogenio777, а что делает приведённый вами код понимаете?
0
0 / 0 / 0
Регистрация: 16.10.2019
Сообщений: 77
17.02.2020, 23:04  [ТС] 3
Ygg, мне не понятны манипуляции с палитрой, так как не слишком знаком с форматами и bmp в частности. Поэтому и прошу помощи здесь
0
2087 / 654 / 243
Регистрация: 10.02.2018
Сообщений: 1,524
18.02.2020, 01:57 4
Вот тут в коде определяется, что будет использована 8ми битная палитра:
C++
1
bmpInfoHeader.biBitCount = 8;
Вот тут в коде определяется сама палитра:
C++
1
2
3
4
5
6
7
 // Палитра черно-белая
    for (int i = 0; i < 256; i++)
    {
        Palette[i].rgbBlue = i;
        Palette[i].rgbGreen = i;
        Palette[i].rgbRed = i;
    }
В этой строке цвет пикселя пересчитывается в индекс палитры:
C++
1
outBuf[j] = 0.3*inBuf[j].rgbtRed + 0.59*inBuf[j].rgbtGreen + 0.11*inBuf[j].rgbtBlue;
Пересчёт приблизительно ведётся по формулам для яркости (Y) соответствующим цветовому пространству BT.601

В результате получается, что вместо 3 байт на цвет теперь используется только один байт, который определяет индекс в чёрно белой палитре. Получилось так себе "сжатие" с потерей цветности в 3 раза. Если вы хотите "сжимать" таким же образом ещё сильнее, то теперь нужно уменьшать битность палитры.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.02.2020, 01:57

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Сжатие файлов
Обьясните нубу почему при сжатии gzip размер файла у меня наоборот увеличивается??? Например при...

Сжатие файлов
Здравствуйте, подскажите как можно сжать файлы в Windows 7 ? (avi, mkv) И так, чтобы их можно было...

Сжатие старых файлов
ВСЕМ ЗДРАСТЕ В очистке диска есть пункт &quot;старые файлы&quot;, занимает места прилично (HDD не большой,...

Сжатие набора файлов
Здравствуйте. Есть некая структура папок с файлами, в коде имеется список FileInfo файлов, которые...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.