С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Metaforij
0 / 0 / 0
Регистрация: 24.05.2014
Сообщений: 7
#1

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

22.07.2014, 15:52. Просмотров 1509. Ответов 7
Метки нет (Все метки)

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

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

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

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

Преобразовать bmp в текст - C++ Builder
Здравствуйте. Собсвенно, вот проблема. Имеется капча - ЛК] , нужно преобраовать картинку в текст , задумка такая, сделать образец к...

Поворот (вращение) изображения формата bmp - C++ Builder
Решил реализовать данную задачу, используя лишь математику (теорию взял из Википедии - "поворот Гивенса", "поворот", "матрица поворота",...

Прочитать заголовок изображения формата .bmp - C++ Builder
Пытаюсь прочитать заголовок изображения формата .bmp (заголовок файла уже прочитал): BITMAPINFOHEADER info; ZeroMemory(&info,...

Преобразование неизвестного формата (.US0) в .txt - C++ Builder
Подскажите пожалуйста способ, как преобразовать формат .US0 (его структура известна) в .txt в Builder C++. Например, как с использованием...

Преобразовать JPG или PNG в BMP - C++ Builder
Есть код: if(clk == "jpg" || clk == "JPG" || clk == "JPEG" || clk == "jpeg") { try { jpg->LoadFromStream(s); ...

Преобразовать из формата HEX в DEC - C++ Builder
на USB RS 485 в буфер чтения присылается байт данных в виде массива каждые несколько миллисекунд #define BUFSIZE 255 //ёмкость...

7
frostyfull
22.07.2014, 15:58
  #2

Не по теме:

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

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

Не по теме:

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

0
samsebe
31 / 27 / 1
Регистрация: 25.01.2010
Сообщений: 151
22.07.2014, 16:12 #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;
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.07.2014, 16:20 #5
http://jenyay.net/Programming/Bmp
0
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
22.07.2014, 16:25 #6
Цитата Сообщение от Metaforij Посмотреть сообщение
Написать программу, которая преобразует текст из *.txt (в любой кодировке: ASCII, Юникод и др..) в картинку формата *.bmp.
http://msdn.microsoft.com/en-us/library/ms535370%28v=vs.85%29.aspx
http://msdn.microsoft.com/en-us/library/ms536159%28v=vs.85%29.aspx
http://msdn.microsoft.com/ru-ru/libr...=vs.85%29.aspx

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

Не вывести картинку из BMP файла на экран - Visual C++
Всем привет! :) Всё перерыл-перепробовал, две недели бьюсь - ничего не выходит :( Я понимаю, что не оригинален, но, пожалуйста, помогите,...

Как в dev c++ встроить в ресурсы картинку bmp? - C++ WinAPI
Господа вот так вывожу картинку на экран - #include &lt;windows.h&gt; /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure...

Как вставить картинку BMP в приложении Win32 GUI - C++ WinAPI
Доброго времени суток. Пишу программу (MDI-редактор, Soft Text Editor For Webmasters) на C++, стало необходимым вставить картинку в формате...

Как сохранить картинку из буфера обмена в файл bmp - C++ WinAPI
Ребята, как с помощью WinAPI сохранить картинку из буфера обмена CF_DIB, в файл .bmp Совсем запутался.


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

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

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