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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Сдвиг элементов одномерного массива по условию http://www.cyberforum.ru/cpp-beginners/thread1068761.html
Есть функция, она считает количество нулевых элементов (counter) и удаляет его (нулевой элемент). Работает вроде бы правильно, но сдвиг работает неправильно. Подскажите, как исправить? int *ZeroElementsCounter(int* _array, int n) { int counter = 0, i, k; for (i = 0; i < n; i++) { if (_array == 0) { _array = _array;
C++ Самый редко встречающийся элемент в массиве Всех приветствую! Прошу помощи. Собственно идея задачи вроде бы проста нужно найти самый часто и редко встречающийся эллемент в массиве. Вот я написал для поиска частого элемента и поиска редкого, загвостка в том что он выводит только одно вхождение, т.е. если несколько элементов встречаются одинаковое колличества раз, то он выводит только последние увиденные. вот код, для вывода редко... http://www.cyberforum.ru/cpp-beginners/thread1068758.html
Вывести на экран сведения об однофамильцах содержащиеся в файле C++
Привет, ребят. Вы мне очень помогли с прошлой задачей) подскажите пожалуйста и с последней) я её начала немного делать( пробовала вносить данные в файлик, по методичке). Условие задачи такое: Создать текстовый файл, содержащий информацию о человеке – фамилия, имя, отчество, год рождения. Вывести на экран сведения об однофамильцах содержащиеся в файле. Дополнительных массивов не использовать....
Неизвестная ошибка C++
Ребята все работает все запускается, но ошибка не исчезает... Подскажите...
C++ Обратится ко второму классу http://www.cyberforum.ru/cpp-beginners/thread1068705.html
Пытаюсь через вызов первого класса вывести info второго класса, но никак :(соответственно все разбиваю по файлам) Cfirst.h #ifndef CFIRST #define CFIRST class CFirst{ CSecond* second; //создаем обьект на второй класс public: CFirst(); //конструктор по умол CFirst(CSecond* Second); // конструктор с парам
C++ Приведение типов В чем различие привидения типа (type)expression, от type(expression)? подробнее

Показать сообщение отдельно
KOPOJI
Модератор
Эксперт HTML/CSSЭксперт PHP
16695 / 6621 / 431
Регистрация: 12.06.2012
Сообщений: 19,875
Завершенные тесты: 1
11.01.2014, 20:39
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;
}
Вернее, даже, я практически не с нуля писал, а переписывал, поэтому некоторая "сумбурность" в коде..
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru