Форум программистов, компьютерный форум CyberForum.ru

Преобразовать текст из *.txt (в любой кодировке) в картинку формата *.bmp - C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Metaforij
0 / 0 / 0
Регистрация: 24.05.2014
Сообщений: 7
22.07.2014, 15:52     Преобразовать текст из *.txt (в любой кодировке) в картинку формата *.bmp #1
Привет)
Нужна помощь с написанием программы..нужна информация)

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

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

Это мое задание на практику, до этого были задания полегче.. Много искал в интернете на эту тему, но не смог найти то, что помогло бы мне в написании программы. Поэтому обращаюсь сюда за подсказками, может подскажете как все это можно реализовать и с помощью чего)
Изображения
  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2014, 15:52     Преобразовать текст из *.txt (в любой кодировке) в картинку формата *.bmp
Посмотрите здесь:

Работа с файлами BMP формата C++
Конвертировать bmp файл в txt C++
Не вывести картинку из BMP файла на экран Visual C++
Как в dev c++ встроить в ресурсы картинку bmp? C++ WinAPI
C++ Builder Преобразовать bmp в текст
Преобразование неизвестного формата (.US0) в .txt C++ Builder
Исправить программу, чтоб считывала текст из файла Input.txt и выводит в файл Output.txt C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
frostyfull
22.07.2014, 15:58
  #2

Не по теме:

Metaforij, это не особо похоже на С++ для начинающих)

Metaforij
22.07.2014, 16:07  [ТС]
  #3

Не по теме:

Цитата Сообщение от frostyfull Посмотреть сообщение
Metaforij, это не особо похоже на С++ для начинающих)
просто я начинающий, боюсь писать в раздел для экспертов)
такое сложное задание внезапно свалилось на мою голову..

samsebe
31 / 27 / 1
Регистрация: 25.01.2010
Сообщений: 145
22.07.2014, 16:12     Преобразовать текст из *.txt (в любой кодировке) в картинку формата *.bmp #4
Может эта информация чем то поможет:

В библиотеке graph нет функции, обеспечивающей вывод на экран иллюстрации, находящейся в файле. Программист должен сам разработать такую функцию. Однако эта задача является довольно сложной. Ниже приведен текст разработанной автором функции draw, которая выводит на экран 16-цветную картинку — содержимое bmp-файла. Картинка должна быть создана в среде Microsoft Windows, например, при помощи графического редактора Paint.

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
#include <stdio.h> #include <graphics.h>
 
/* Функция draw выводит на экран шестнадцатицветную
картинку, находящуюся в bmp-файле
 
*/ int draw(int xO, int yO, char* fname)
х00 — координаты левого верхнего угла
области вывода fname — имя файла картинки;
Значения функции:
>0 — высота иллюстрации; -1 — не найден файл; -2 — картинка не является шестнадцатицветной.
*/
// таблица преобразования кодировки // цвета Windows -> DOS
unsigned char color[16] =
{0,4,2,6,1,5,3,7, 8,12,10,14,9,13,11,15};
// прочитав из bmp-файла эту структуру, // можно получить информацию о картинке: //ее размере и количестве цветов struct bmpinfo {
char hl,h2; // файл должен начинаться буквами ВМ unsigned long
size, // размер файла, байт reserved, // резерв, не используется offset, // смещение данных относительно
// начала файла Ь, // не используется width, // ширина картинки height; // высота картинки unsigned int
plans, // кол-во планов, должно содержать 1 Ьрр; // кол-во бит на пиксел: 1, 4, 8 или 24
bmpinfo info; FILE *?;
// информация о картинке // файл иллюстрации
int x,y; // координаты пиксела unsigned char b; // байт, прочитанный из файла unsigned char bh; // сдвинутый на 4 разряда вправо
// старший полубайт unsigned char bl; // четыре младшие бита
// прочитанного байта int nb; // кол-во байт (кратное четырем)
// соответствующее строке
int np; // кол-во выведенных пикселов
int i,j;
if ((f = fopenffname, "rb")) == NULL) return -1;
// читаем информацию о картинке
fread(Sinfo, sizeof(info),1, f);
if (info.bpp != 4 )
return -2; // картинка не 16-цветная
x = xO;
у = yO + info.height;
nb = (info.width / 8)*4;
if ((info.width /8) != 0) nb += 4;
fseek(f, info.offset, SEEK_SET); ¦
// вывод иллюстрации
for (i = 0; i < info.height; i++)
np =0; // кол-во выведенных пикселов for (j = 0; j < nb; j++) // вывод строки {
b = fgetc(f) ;
if ( np < info.width)
{
bh = b » 4;
putpixel(x,y,color[bh]);
np++; } if (np < info.width)
Ы = b & 15;
putpixel(x,y,color[bl]); -
np++;
x=xO; y— ;
fclose(f);
return info.height;
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.07.2014, 16:20     Преобразовать текст из *.txt (в любой кодировке) в картинку формата *.bmp #5
http://jenyay.net/Programming/Bmp
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
22.07.2014, 16:25     Преобразовать текст из *.txt (в любой кодировке) в картинку формата *.bmp #6
Цитата Сообщение от Metaforij Посмотреть сообщение
Написать программу, которая преобразует текст из *.txt (в любой кодировке: ASCII, Юникод и др..) в картинку формата *.bmp.
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
http://msdn.microsoft.com/ru-ru/libr...=vs.85%29.aspx

Добавлено через 1 минуту
Цитата Сообщение от Metaforij Посмотреть сообщение
такое сложное задание внезапно свалилось на мою голову..
Строк 10-20. На GDI+
maxon887
 Аватар для maxon887
12 / 12 / 3
Регистрация: 05.06.2012
Сообщений: 280
22.07.2014, 17:09     Преобразовать текст из *.txt (в любой кодировке) в картинку формата *.bmp #7
У тебя проблемы в постоновке задачи.
Во-первых, матрица bmp должна иметь линейные размыеры (ширину, высоту). Сразу возникает вопрос, откуда брать эти данные. Что делать если число символов не кратно ширине*высоту.
Во-вторых, надо определится глубиной цвета, мол сколько байт на один пиксель, самый простой вариант это 8битной изображение(для ascii один символ). Но если эта трансформация должна иметь какой-то смысл, то с Юникодом тяжелее. Надо разбиратся с видом преобразования уникода utf8 utf16 bomutf.
Ответь на поставленные вопросы, потом будем дальше решать твою проблему
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2014, 22:29     Преобразовать текст из *.txt (в любой кодировке) в картинку формата *.bmp
Еще ссылки по теме:

C++ C++, взять файл формата bmp
Прочитать заголовок изображения формата .bmp C++ Builder
C++ WinAPI Как сохранить картинку из буфера обмена в файл bmp
Поворот (вращение) изображения формата bmp C++ Builder
Сделать скриншот экрана и сохранить в файл формата jpg или bmp C++

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

Или воспользуйтесь поиском по форуму:
StailGot
27 / 22 / 6
Регистрация: 25.08.2013
Сообщений: 41
23.07.2014, 22:29     Преобразовать текст из *.txt (в любой кодировке) в картинку формата *.bmp #8
Metaforij, вот пример, выводит текст utf-8 в bmp файл.
C++ (Qt)
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
#include <algorithm>
#include <iterator>
#include <fstream>
#include <memory>
#include <string>
#include <sstream>
 
#include <windows.h>
#include <Gdiplus.h>
#pragma comment( lib,"Gdiplus.lib" )
 
using namespace std;
 
int GetEncoderClsid( const WCHAR * format, CLSID * pClsid );
std::unique_ptr<CLSID> GetBMPClsid();
void InitGDI();
 
int main()
{
  namespace gdi = Gdiplus;
 
  ::InitGDI();
 
  const std::wstring TEXT_FILE     = L"A:/file.txt";    // где брать текст
  const std::wstring BMP_SAVE_PATH = L"A:/image.bmp";   // куда сорханять
 
  gdi::Bitmap bmp( 1000, 1000 ); // буфер, куда рисовать
  gdi::Graphics graphics( &bmp ); // графическое устройство, чем рисовать
  gdi::SolidBrush whiteBrush( gdi::Color::White );
  gdi::SolidBrush blackBrush( gdi::Color::Black );
 
  gdi::Font font( L"Arial", 12 );
  gdi::RectF rect( 100, 100, 800, 900 );
 
  std::ifstream text( TEXT_FILE );
 
  std::string string; // читаем файл в одну большую строку
  std::copy( std::istreambuf_iterator<char>( text )
             , std::istreambuf_iterator<char>()
             , std::back_inserter( string ) );
 
  graphics.FillRectangle( &whiteBrush, gdi::Rect { 0, 0, 1000, 1000 } ); // заливка фона белым цветом
 
  gdi::StringFormat format;
  std::unique_ptr<wchar_t []> buf( new wchar_t [string.length()]() );
 
  ::MultiByteToWideChar( CP_UTF8, NULL, string.c_str(), (INT)string.size(), buf.get(), (INT)string.length() );
 
  // рисуем текст
  graphics.DrawString( buf.get(), (INT)string.length(), &font, rect, &format, &blackBrush );
 
  // сохраняем 
  bmp.Save( BMP_SAVE_PATH.c_str(), GetBMPClsid().get() );
  return EXIT_SUCCESS;
}
 
 
 
 
std::unique_ptr<CLSID> GetBMPClsid()
{
  std::unique_ptr<CLSID> bmpClsid( new CLSID );
  ::GetEncoderClsid( L"image/bmp", bmpClsid.get() );
  return bmpClsid;
}
 
 
void InitGDI()
{
  using namespace Gdiplus;
 
  GdiplusStartupInput gdiplusStartupInput;
  ULONG_PTR gdiplusToken;
  GdiplusStartup( &gdiplusToken, &gdiplusStartupInput, NULL );
};
 
 
int GetEncoderClsid( const WCHAR * format, CLSID * pClsid )
{
  using namespace Gdiplus;
 
  UINT  num = 0;          // number of image encoders
  UINT  size = 0;         // size of the image encoder array in bytes
 
  ImageCodecInfo * pImageCodecInfo = NULL;
 
  GetImageEncodersSize( &num, &size );
  if ( size == 0 )
    return -1;  // Failure
 
  pImageCodecInfo = ( ImageCodecInfo *)( malloc( size ) );
  if ( pImageCodecInfo == NULL )
    return -1;  // Failure
 
  GetImageEncoders( num, size, pImageCodecInfo );
 
  for ( UINT j = 0; j < num; ++j )
  {
    if ( wcscmp( pImageCodecInfo [j].MimeType, format ) == 0 )
    {
      *pClsid = pImageCodecInfo [j].Clsid;
      free( pImageCodecInfo );
      return j;  // Success
    }
  }
 
  free( pImageCodecInfo );
  return -1;  // Failure
}
Yandex
Объявления
23.07.2014, 22:29     Преобразовать текст из *.txt (в любой кодировке) в картинку формата *.bmp
Ответ Создать тему
Опции темы

Текущее время: 19:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru