Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.90/10: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Metaforij
0 / 0 / 0
Регистрация: 24.05.2014
Сообщений: 7
1

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

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

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

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

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

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

Загрузить изображение формата bmp и работать с ним побитово
Мне нужно загрузить изображение формата bmp, чтоб потом работать с его битами....

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

Прочитать заголовок изображения формата .bmp
Пытаюсь прочитать заголовок изображения формата .bmp (заголовок файла уже...

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

Преобразовать JPG или PNG в BMP
Есть код: if(clk == "jpg" || clk == "JPG" || clk == "JPEG" || clk == "jpeg")...

7
frostyfull
22.07.2014, 15:58
  #2

Не по теме:

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

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

Не по теме:

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

0
samsebe
43 / 36 / 8
Регистрация: 25.01.2010
Сообщений: 193
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
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.07.2014, 16:20 5
http://jenyay.net/Programming/Bmp
0
uglyPinokkio
326 / 229 / 55
Регистрация: 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 / 7
Регистрация: 05.06.2012
Сообщений: 280
22.07.2014, 17:09 7
У тебя проблемы в постоновке задачи.
Во-первых, матрица bmp должна иметь линейные размыеры (ширину, высоту). Сразу возникает вопрос, откуда брать эти данные. Что делать если число символов не кратно ширине*высоту.
Во-вторых, надо определится глубиной цвета, мол сколько байт на один пиксель, самый простой вариант это 8битной изображение(для ascii один символ). Но если эта трансформация должна иметь какой-то смысл, то с Юникодом тяжелее. Надо разбиратся с видом преобразования уникода utf8 utf16 bomutf.
Ответь на поставленные вопросы, потом будем дальше решать твою проблему
0
StailGot
28 / 23 / 12
Регистрация: 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

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

Преобразовать из формата HEX в DEC
на USB RS 485 в буфер чтения присылается байт данных в виде массива каждые...

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


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

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

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