Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.07.2014, 15:52   #1
Metaforij
Новичок
Джуниор
 
Регистрация: 22.07.2014
Сообщений: 1
По умолчанию из *.txt в *.bmp

Привет)
Нужна помощь с написанием программы..нужна информация)

Задание:
Написать программу, которая преобразует текст из *.txt (в любой кодировке: ASCII, Юникод и др..) в картинку формата *.bmp.

Поискав информацию в интернете, я подумал что можно было бы сделать как-то так:
Из текстового документа берется текст и преобразуется в матрицу (каждый элемент которой - это пиксель со своим оттенком) по которой строится bmp изображение и этот текст уже становится изображением.
Проблема в том, что я не знаю как преобразовать текст в матрицу..
- Мб есть такая возможность брать информацию из шрифтов windows?
- Мб мне самому создать алфавит, т.е. матрицы для каждого символа - только это очень долго и нудно.

Это мое задание на практику, до этого были задания полегче.. Много искал в интернете на эту тему, но не смог найти то, что помогло бы мне в написании программы. Поэтому обращаюсь сюда за подсказками, может подскажете как все это можно реализовать и с помощью чего)

Последний раз редактировалось Metaforij; 22.07.2014 в 15:55.
Metaforij вне форума Ответить с цитированием
Старый 22.07.2014, 17:29   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Простой вариант:
1. Берете текст
2. Создаете на чем будете рисовать Canvas, GDI+, директх или опенгл контескст...
3. Рисуете надпись более-менее стандартными функциями
4. Сохраняете в файл-картинки

П.С. Кажись что-то подобное было в толстой книге с названием "программирование графики (GDI) для виндовс" Фень Юань
p51x вне форума Ответить с цитированием
Старый 24.07.2014, 08:24   #3
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Заинтересовала задача. Накидал:
Код:
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
	SIZE sz;
	char txt[256];
	setlocale(LC_ALL,"Russian");//русская локаль
	cout << "text: ";
	cin.getline(txt,256);
	OemToCharBuff(txt,txt,lstrlen(txt));
	HFONT font=CreateFont(60,0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,"Times New Roman");
    HDC winDC = GetDC(NULL);	//Получение контекста окна
	HDC cdc=CreateCompatibleDC(winDC);	//создать совместимый контекст
	SelectObject(cdc,font);				//выбрать в него шрифт
	GetTextExtentPoint32(cdc,txt,lstrlen(txt),&sz);	//Получить размер надписи, выведенной этим шрифтом
	sz.cx=(sz.cx+3)&0xfffffffc;
	HBITMAP bbb=CreateCompatibleBitmap(cdc,sz.cx,sz.cy);	//Создать битмап по размеру надписи
	SelectObject(cdc,bbb);							//выбрать его в контекст
	TextOut(cdc,0,0,txt,lstrlen(txt));				//вывести надпись, когда выбран битмап

    BITMAPINFOHEADER bmpInfoHeader;		//Информационный заголовок
    BITMAPFILEHEADER bmpFileHeader;		//Файловый заголовок
 //Заполняем файловый заголовок нового битмапа
    bmpFileHeader.bfType = 0x4d42;
    bmpFileHeader.bfSize = 0;
    bmpFileHeader.bfReserved1 = 0;
    bmpFileHeader.bfReserved2 = 0;
    bmpFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
 //Заполняем информационный заголовок нового битмапа
    bmpInfoHeader.biSize = sizeof(bmpInfoHeader);
	bmpInfoHeader.biWidth = sz.cx;	
	bmpInfoHeader.biHeight = sz.cy;	
    bmpInfoHeader.biPlanes = 1;
    bmpInfoHeader.biBitCount = 24;
    bmpInfoHeader.biCompression = BI_RGB;
	bmpInfoHeader.biSizeImage = bmpInfoHeader.biWidth*bmpInfoHeader.biHeight*(24/8);	//Размер изображения
    bmpInfoHeader.biXPelsPerMeter = 0;
    bmpInfoHeader.biYPelsPerMeter = 0;
    bmpInfoHeader.biClrUsed = 0;
    bmpInfoHeader.biClrImportant = 0;
 
    BITMAPINFO info;
    info.bmiHeader = bmpInfoHeader;
 
    BYTE* memory;		//битовая карта
    HDC bmpDC = CreateCompatibleDC(winDC);	//Создание совместимого контекста
    //Создаем битмэп
    HBITMAP bitmap = CreateDIBSection(cdc, &info, DIB_RGB_COLORS, (void**)&memory, NULL, 0);
    SelectObject(bmpDC, bitmap);//Выбираем в контекст битмэп
	BitBlt(bmpDC, 0, 0, bmpInfoHeader.biWidth, bmpInfoHeader.biHeight, cdc, 0, 0, SRCCOPY);	//копируем в него костекст изобрадения
    ReleaseDC(NULL, winDC);	//освободить ненужный контекст
 
    HANDLE hFile = CreateFile(		//создание файла
		"1.bmp", 
        GENERIC_WRITE, 
        0,
        NULL,
        OPEN_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL);
    if (hFile == INVALID_HANDLE_VALUE) 
        return -1;
    DWORD dwWritten = 0;
    WriteFile(hFile, &bmpFileHeader, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);	//Запись заголовков
    WriteFile(hFile, &bmpInfoHeader, sizeof(BITMAPINFOHEADER), &dwWritten, NULL);
    WriteFile(hFile, memory, bmpInfoHeader.biSizeImage, &dwWritten, NULL);			//Запись битовой карты
    CloseHandle(hFile);		//закрытие файла



	DeleteObject(bbb);								//Освободить используемые ресурсы
	DeleteDC(cdc);
	DeleteObject(font);		//удаление шрифта

	return 0;
}
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 24.07.2014, 09:55   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Зачем два битмапа - не проще будет прямо в DIB писать? Тогда и winDC не понадобится.
Кто удалит bmpDC?
waleri вне форума Ответить с цитированием
Старый 24.07.2014, 17:17   #5
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Спасибо за критику, все это может сделать ТС)) Я же предупредил, что это набросок, по форматированию даже видно, что скомпонован из разных программ. Собрал за несколько минут, досконально не проверял.
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переделавание кода на считывание из файла в файл output.txt input.txt !!! airesjke Помощь студентам 0 29.05.2013 14:07
Как скопировать текст с файла 1.txt и записать в 2.txt Kasper1 Общие вопросы по Java, Java SE, Kotlin 1 14.12.2010 05:56
Загрузка BMP в Simple Graph и сохранение в BMP формат artemavd Общие вопросы Delphi 10 02.10.2010 14:19
Стеганография (txt в bmp)!!! Metal_Madness Общие вопросы C/C++ 5 02.11.2009 19:49
Как прочесть txt файл www.site.ru/info.txt BR17UY Работа с сетью в Delphi 1 16.04.2007 13:01