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

Как создать картинку, для хранения информации в пикселях - C++

Восстановить пароль Регистрация
 
MihaniX
 Аватар для MihaniX
134 / 44 / 1
Регистрация: 06.08.2013
Сообщений: 292
Записей в блоге: 4
11.01.2014, 20:28     Как создать картинку, для хранения информации в пикселях #1
Как создать картинку? Я хочу хранить в пикселях информацию.
Видел код на дельфи
Delphi
1
2
p:=TBitmap.Create;
     p.LoadFromFile(ExtractFilePath(Application.ExeName)+'\res\'+ neuro_web[i].name+'.bmp')
а как на с++ это сделать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.01.2014, 20:28     Как создать картинку, для хранения информации в пикселях
Посмотрите здесь:

C++ Битовые операции. Написать программу для хранения в битовом поле информации о конфигурации компьютера.
Создать класс который может быть использован для хранения информации и студентах C++
Описать структуру для хранения следующей информации C++
Описать абстрактный класс для хранения информации геометрических фигурах. C++
C++ Объединение используется для хранения информации о трапеции или треугольнике
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
KOPOJI
Модератор
 Аватар для KOPOJI
16243 / 6454 / 390
Регистрация: 12.06.2012
Сообщений: 19,362
11.01.2014, 20:32     Как создать картинку, для хранения информации в пикселях #2
Например, с помощью библиотеки gd. На плюсах изображения не генерировал, но на си писал подобный код

Добавлено через 52 секунды
http://habrahabr.ru/post/52775/
MihaniX
 Аватар для MihaniX
134 / 44 / 1
Регистрация: 06.08.2013
Сообщений: 292
Записей в блоге: 4
11.01.2014, 20:33  [ТС]     Как создать картинку, для хранения информации в пикселях #3

Не по теме:

опять библиотеки...


#include <windows.h> что ни будь можно с этим сделать?
KOPOJI
Модератор
 Аватар для KOPOJI
16243 / 6454 / 390
Регистрация: 12.06.2012
Сообщений: 19,362
11.01.2014, 20:39     Как создать картинку, для хранения информации в пикселях #4
MihaniX, я не под винду писал..
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
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <gd.h>
 
#define BITMAP_CHAR "*"
#define BACK_GROUND_CHAR "_"
#define NEW_LINE "\n"
#define DEPTH_PERCENT 90
 
#define MAX_FILENAME_SIZE 50
#define MAX_BUFFER_SIZE 128
 
 
typedef struct
{
    size_t red;
    size_t green;
    size_t blue;
    size_t alpha;
} Colors_t;
 
 
size_t drawText(const char *);
 
unsigned short checkImageType(const char *);
 
size_t putData(const char *, char *, char *);
 
unsigned short showError(const char *);
 
 
gdImagePtr createImage(const char *, FILE *);
 
size_t imageColorAt(gdImagePtr, int, int);
 
Colors_t imageColorsForIndex(gdImagePtr, size_t);
 
 
int main(void)
{
    //число записанных байт
    size_t bytes = 0;
 
    //имя файла
    char filename[MAX_FILENAME_SIZE];
 
    //выход из программы
    const char *exitcmd = "quit";
 
 
    while(1)
    {
        printf("\nEnter filename or quit to exit..\n");
 
        //читаем имя файла
        fgets(filename, MAX_FILENAME_SIZE, stdin);
        sscanf(filename, "%s", filename);
 
        //если ввели quit - выходим из программы
        if( ! strcmp(filename, exitcmd) )
            break;
 
        //пробуем прочитать и записать
        bytes = drawText(filename);
        printf("%s Записано %ld байт\n",  (bytes ? "Успешно!" : "Ошибка."), bytes) ;
    }
 
    printf("\nGood bye..\n");
    getchar();
 
    return 0;
}
 
 
 
/*
 * функция для записи данных
 * проверяет, является ли имя файла возможным типом
 * 
 * @param char *filename    Имя файла для проверки и открытия
 * 
 * @return size_t bytes     Число записанных байт или 0 в случае ошибки
 */
size_t drawText(const char *filename)
{
 
    FILE *in;
 
    gdImagePtr res; //для ресурса открытого изображения GD
 
    int srcWidth = 0, srcHeight = 0; //ширина и высота исходного изображения
    int dstWidth = 0, dstHeight = 0; //ширина и высота выходного изображения
 
    //переменные для цикла
    int x = 0;
    int y = 0;
 
    size_t color_index; //индекс цвета
    size_t bytes; //число записанных байт
 
    Colors_t color; //структура цвета (reg, green, blue, alpha)
 
    //буфер для записи данных в файл
    char *buffer = (char *) malloc(sizeof(char *) * MAX_BUFFER_SIZE);
 
    //если не получилось выделить память - выводим ошибку и выходим из функции
    if(!buffer)
        return showError("Не удалось выделить память");
 
    //если неверный тип файла - выводим ошибку и выходим из функции
    if(!checkImageType(filename))
        return showError("Неверное имя файла");
 
    //если не удалось открыть файл - выводим ошибку и выходим из функции
    if ( !(in = fopen(filename, "rb")) )
        return showError("Не удалось открыть файл");
 
    //если не получилось создать изображение - выводим ошибку и выходим из функции
    if( !(res = createImage(filename, in)) )
        return showError("Ошибка создания изображения");
 
    //узнаем исходную ширину и высоту изображения
    srcWidth = gdImageSX(res);
    srcHeight = gdImageSY(res);
 
    // Новая ширина изображения
    dstWidth = (int)( srcWidth / (srcHeight / 20) );
    // Новая высота изображения
    dstHeight = 20;
 
    //создаем пустое изображение
    gdImagePtr out = gdImageCreateTrueColor(dstWidth, dstHeight);
 
    //копируем изображение, подгоняя под нужный размер
    gdImageCopyResampled(out, res, 0, 0, 0, 0, dstWidth, dstHeight, srcWidth, srcHeight);
 
    *buffer = '\0';
    // Проходим по всем пикселам изображений
    for(y = 0; y < dstHeight; y++)
    {
        for(x = 0; x < dstWidth; x++)
        {
            //получаем код цвета пиксела                
            color_index = imageColorAt(out, x, y);
            //переводим в RGB формат по коду цвета пиксела
            color = imageColorsForIndex(out, color_index);
            // Выбор между тонами
            buffer = strcat( buffer, (color.blue < 2.55 * DEPTH_PERCENT ? BITMAP_CHAR : BACK_GROUND_CHAR) );
        }
        // Дополняем вывод переводом строки
        buffer = strcat(buffer, NEW_LINE);
    }
 
    //освобождаем память, выделенную под изображения
    gdImageDestroy(out);
    gdImageDestroy(res);
 
    //закрываем файл
    fclose(in);
 
    //пробуем записать данные в файл
    bytes = putData(filename, "txt", buffer);
 
    //освобождаем выделенную память
    free(buffer);
 
    //возвращаем число записанных байт
    return bytes;
}
 
 
/*
 * Функция для записи данных в файл
 * 
 * @param const char *filename  Имя файла для записи
 * @param char *type        Тип файла для записи
 * @param char *data        Данные для записи
 * 
 * @return size_t bytes         Возвращает количество записанных байт или 0 в случае ошибки
 */
size_t putData(const char *filename, char *type, char *data)
{
    //число записанных байт
    size_t bytes = 0;
    //выделяем память под имя файла
    char tmp[ sizeof filename + sizeof type + 1 ];
 
    FILE *out;
 
    //составляем имя файла
    sprintf(tmp, "%s.%s", filename, type);
 
    //пробуем создать файл
    out = fopen(tmp, "wb");
    if(!out)
        return 0;
    //записываем данные
    bytes = fwrite( data, 1, strlen(data), out );
    //закрываем поток
    fclose(out);
    //возвращаем число записанных байт
    return bytes;
}
 
 
/*
 * Функция проверяет тип файла по переданному имени
 * 
 * @param const char *filename  Имя файла для проверки
 * 
 * @return unsigned short       Возвращает 0 в случае ошибки или 1 в случае успеха
 */
unsigned short checkImageType(const char *filename)
{
    //ищем последнее вхождение точки в имени файла
    const char *type = strrchr(filename, '.');
 
    //допустимые типы файлов
    const char *allowedTypes[] = {"jpeg","jpg","png","gif"};
 
    //счетчик
    int i = 0; 
 
    //вычисляем длину массива с допустимыми типами файлов
    int length = (int) sizeof allowedTypes / sizeof allowedTypes[0];
 
    //если в имени файла отсутствует точка - возвращаем ошибку (0)
    if(!type)
        return 0;
 
    type++;
 
    //если тип файла соответствующий - возвращаем 1, иначе возвращаем 0
    for(i = 0; i < length; i++)
        if(!strcmp(type, allowedTypes[i]))
            return 1;
    return 0;
}
 
 
/*
 * Функция создает изображение
 * 
 * @param const char *filename  Имя файла для создания изображения
 * @param FILE *image           Указатель на файл с изображением
 * 
 * @return gdImagePtr           Возвращает ресурс созданного изображения
 *                              или NULL в случае ошибки
 */
gdImagePtr createImage(const char *filename, FILE *image)
{
    //определяем тип файла
    const char *type = strrchr(filename, '.');
 
    if (!type)
        return NULL;
 
    type++;
 
    //проверяем тип файла и создаем соответствующее изображение
    if(!strcmp(type, "jpeg") || !strcmp(type, "jpg"))
        return gdImageCreateFromJpeg(image);
    if(!strcmp(type, "png"))
        return gdImageCreateFromPng(image);
    if( !strcmp(type, "gif"))
        return gdImageCreateFromGif(image);
    return NULL;
}
 
 
/*
 * @param gdImagePtr im Ресурс с изображением
 * @param int x         Отступ по оси Ox
 * @param int y         Отступ по оси Oy
 * 
 * @return size_t       Возвращает код цвета пиксела или 0 в случае ошибки
 */
size_t imageColorAt(gdImagePtr im, int x, int y)
{
    //если изображение полноцветовое
    if(im->tpixels && gdImageBoundsSafe(im, x, y))
    {
        //если изображение полноцветовое
        if(gdImageTrueColor(im))
            return gdImageTrueColorPixel(im, x, y);
        else
            return im->pixels[y][x];
    }
    return 0;
}
 
 
/*
 * Функция переводит в формат RGB цвет пиксела по коду пиксела
 * 
 * @param gdImagePtr im Ресурс созданного изображения
 * @param size_t col    Код цвета пиксела
 * 
 * @return Colors_t     Возвращает структуру с цветами в RGB
 */
Colors_t imageColorsForIndex(gdImagePtr im, size_t col)
{
    //структура для цвета в формате RGBA
    Colors_t color;
 
    //берем цвета в формате RGBA
    color.red       = gdImageRed(im, col);
    color.green     = gdImageGreen(im, col);
    color.blue      = gdImageBlue(im, col);
    color.alpha     = gdImageAlpha(im, col);
 
    return color;
}
 
 
/*
 * Функция выводит сообщение об ошибке
 * 
 * @param const char *msg   Текст сообщения об ошибке
 * 
 * @return unsigned short   Возвращает 0
 */
unsigned short showError(const char *msg)
{
    printf("\n%s\n", msg);
    return 0;
}
Вернее, даже, я практически не с нуля писал, а переписывал, поэтому некоторая "сумбурность" в коде..
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11847 / 6826 / 771
Регистрация: 27.09.2012
Сообщений: 16,929
Записей в блоге: 2
Завершенные тесты: 1
11.01.2014, 20:39     Как создать картинку, для хранения информации в пикселях #5
LoadImage function
CreateBitmap function
KOPOJI
11.01.2014, 20:40
  #6

Не по теме:

Цитата Сообщение от MihaniX Посмотреть сообщение
опять библиотеки...
Напишите свои, в чем проблема

MihaniX
 Аватар для MihaniX
134 / 44 / 1
Регистрация: 06.08.2013
Сообщений: 292
Записей в блоге: 4
11.01.2014, 21:01  [ТС]     Как создать картинку, для хранения информации в пикселях #7
Да с радостью! Только опыта бы по больше...

Добавлено через 16 минут
Цитата Сообщение от Croessmah Посмотреть сообщение
А если я создаю эту картинку, мне основной код все равно писать в WinMain? Или нет?

Добавлено через 2 минуты
что то не могу с винапи разобраться...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2014, 21:57     Как создать картинку, для хранения информации в пикселях
Еще ссылки по теме:

Разработать объектную структуру для хранения информации в титульном листе зачетной книжки C++
C++ Разработать объектную структуру для хранения информации о зачетной книжке
Как создать шаблонный класс-массив для хранения объектов? C++

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

Или воспользуйтесь поиском по форуму:
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
11.01.2014, 21:57     Как создать картинку, для хранения информации в пикселях #8
http://www.boost.org/doc/libs/1_55_0...doc/index.html
Yandex
Объявления
11.01.2014, 21:57     Как создать картинку, для хранения информации в пикселях
Ответ Создать тему
Опции темы

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