Итак, сегодня я подхожу к завершающей части одного из циклов статей, а именно о работе с BMP файлами. Сегодня я попробую рассказать, как можно писать и читать в файл BMP текстовые данные.

14927 Кодировка текста в BMP
Впрочем читать и писать можно и не текст, а к примеру другую картинку или музончик. Как это работает? BMP файлик без палитры содержит массив структур типа RGBTRIPLE. А что нам мешает использовать младшие три бита каждого цвета? Цветопотеря будет практически не ощутимой, а пользы будет много.Так вот, что я сделал в исходнике? Здесь я пытался сначала записать данные, потом считать их. Вот код:

#include 
#include 

int main()
{
        char szBmp[MAX_PATH] = {0};
        printf("Enter bmp file: ");
        gets(szBmp);

        HANDLE hFile = CreateFileA(szBmp,GENERIC_READ|GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,NULL,NULL);

        printf("Enter message and press [Enter] + [Ctrl+Z] + [Enter] to quit:\n");

        BITMAPFILEHEADER bfh;
        BITMAPINFOHEADER bih;

        DWORD dwR;

        ReadFile(hFile,(char *)&bfh,sizeof(BITMAPFILEHEADER),&dwR,NULL);
        ReadFile(hFile,(char *)&bih,sizeof(BITMAPINFOHEADER),&dwR,NULL);

        SetFilePointer(hFile,bfh.bfOffBits,NULL,FILE_BEGIN);

        char c;
        do 
        {
                c = getchar();
                RGBTRIPLE pixel;
                ReadFile(hFile,(char *)&pixel,sizeof(RGBTRIPLE),&dwR,NULL);

                //       c
                //|  c1  |  c2  |  c3  |
                //   2      3      3

                pixel.rgbtBlue &= ~7;
                pixel.rgbtGreen &= ~7;
                pixel.rgbtRed &= ~7;

                char c1,c2,c3;
                c1 = c2 = c3 = c;

                c3 &= 7;
                c2 >>= 3;
                c2 &= 7;
                c1 >>= 6;

                pixel.rgbtBlue |= c1;
                pixel.rgbtGreen |= c2;
                pixel.rgbtRed |= c3;

                SetFilePointer(hFile,-sizeof(RGBTRIPLE),NULL,FILE_CURRENT);
                WriteFile(hFile,&pixel,sizeof(RGBTRIPLE),&dwR,NULL);
        }while(c!=EOF);

        SetFilePointer(hFile,bfh.bfOffBits,NULL,FILE_BEGIN);

        do 
        {
                RGBTRIPLE pixel;
                ReadFile(hFile,(char *)&pixel,sizeof(RGBTRIPLE),&dwR,NULL);
                pixel.rgbtBlue &= 7;
                pixel.rgbtBlue 
                      

Байт состоит из восьми бит, но я для симметрии взял 9 — 3 из каждого цвета. В первом цикле записи нарисована небольшая схемка, как я распиливаю символ. Если вы хорошо знаете битовые логические операции — то сложного ничего нет. Иначе, опишу, как работает первый цикл: сначала читаем символ и пиксел. Затем обнуляем первые три бита у каждого цвета, потом распиливаем символ по битам и записываем пиксел на место. Со вторым циклом проблем возникнуть не должно. Для того, чтобы еще глубже вникнуть в тему, посмотрите статьи о BMP на нашем блоге.

tt twitter big4 Кодировка текста в BMP tt digg big4 Кодировка текста в BMP tt facebook big4 Кодировка текста в BMP tt gmail big4 Кодировка текста в BMP tt myspace big4 Кодировка текста в BMP tt reddit big4 Кодировка текста в BMP

Оставить комментарий

CAPTCHA изображение
Обновить изображение
*

RSS-подписка NIG Twitter-подписка NIG

Метки
Друзья
Блог линуксоида Программы для диагностики компьютера
Супер Pixel
Убивалка флешаБэкконект шелл. Часть вторая.Бэкконект шелл. Начало.НАМ для деления чиселПростая арифметикаПередача файлов. Часть третья. Клиент.Dll injectionСканер портовКодировка текста в BMPРухнул на два дняПередача файлов. Часть вторая. Сервер.Поворот и BMPCRC32 суммаBMP форматфайловые вирусыассемблер, строкиАссемблер и матрицапримеры ассемблерМногопоточное программированиеАрхитектура клиент — серверРаздача ICQПишем шуткупишем паукаПривет от ДжеймсаОбход firewallЗагрузка картинок на Gyazo, прямо из ThunarКейлоггер 3Плюшки в контекстном меню Thunarc по сетиКейлоггер 2КейлоггерСкачать Ассемблер!VirusCheckerОтморозки мешают жить ?! Не проблемма !Cкрипты для взлома аккаунтов QIPWinAPI. Работа с файлами. Часть третья. ЧтениеDlink exploitБрут сайта etxt.ruКрасивая раскладка клавиатуры в GnomeМои безделушки на PerlКак запускать Perl скрипты под WindowsБрутфорс партнёрки ZipCoinПарсер upwap.ruИзменения в блогеЧудо ЗаливалкаСкрипт для загрузки файлов на Zalil.ruЯндекс «чоткий» поисковик!WinAPI. Работа с файлами. Часть вторая. ЗаписьWinAPI. Работа с файлами. Часть первая. ПоискПолучение MD5 хеша средствами C++Что нам стоить letitfile.com забрутить?WarCraft III запуск под LinuxЭнтропия файлаWinsock и C++. Мини прокси. Часть |\\/. Завершающая.Перепилил чекер для 4gameЧекер акаунтов YoupornCMailSend v 1.1. Отправка почы без проблемСлучайные числаWinsock и C++. Часть |||. smtp монстр.Брутфорс LetitFile.comИспользование X-Forwarded-For, для обмана веб-сервера, подмена IP подручными средствамиДело было вечером, делать было нечего…Мысли о аудио сервереПарсер ников из твиттераКонец школоло…Perl+Linux. Заметка первая (Удобный Paste bin).Бэкконект шелл.E-MAIL + winsocket + Cpp. Сложно?winsock и C++. Часть ||. Атака клоунов.C++ резолвинг адресаPerl, анализ HTML кода и определение CMSМатематика в C++winsock и C++