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

Нужно написать алгоритм сжатия бмп файла

13.02.2020, 20:15. Просмотров 154. Ответов 1
Метки bmp, c++ (Все метки)

Код делает картину черно былой, понимаю, что это происходит через палитру , но как - понять не могу. Нужно сжать в соотношении 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
13.02.2020, 20:15
Ответы с готовыми решениями:

написать код для создания бмп файла заданного размера си++
как написать код для создания бмп файла,размеры задаем сами.в последующем применяем для его...

Как написать лучший алгоритм сжатия
Проснулся сегодня в 5 часов утра, приснилось что я алгоритм сжатия данных придумал, да такой, что...

Написать простой алгоритм сжатия для строки
Написать простой алгоритм сжатия для строки. Например, строка {Helllllo Wooooorld} должна быть...

Написать простой алгоритм сжатия для строки
2. Написать простой алгоритм сжатия для строки. Так, например, строка Helllllo Wooooorld! Может...

1
фрилансер
1439 / 1005 / 292
Регистрация: 11.10.2019
Сообщений: 3,187
13.02.2020, 20:28 2
eogenio777, почему бы не воспользоваться StretchDIBits ?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.02.2020, 20:28

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

Мне нужно в программе, метки заменить на цикл(программа реализации сжатия информации алгоритм RLE)
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics,...

Считывание бмп файла
хочу считать бмп файл размер 225x225 в массив чисел , изображение черно белое и когда делаю вывод...

Создание бмп файла
У меня есть массив 224x224 , и нужно массив записать в бмп файл (изображение черно-белое)

Считать палитру бмп файла
Помогите мне нужно считать палитру бмп файла, файл черно-белый 8 бит на пиксель 256 цветов я...


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

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

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