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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
lenston
2 / 0 / 1
Регистрация: 12.11.2014
Сообщений: 33
#1

Чтение файла GIF. Перевод текста в HEX. Декодирование GIF анимации - C++

15.11.2014, 15:29. Просмотров 1563. Ответов 14
Метки нет (Все метки)

Всем привет.. задача такая:

Необходимо открыть файл GIF.. Например, как в этой статье про декодирование..

http://www.cyberforum.ru/redirector....YxMjcwODMlMkY=

Название: 680f35a7.gif
Просмотров: 159

Размер: 46 байт

Открыть этот файл и перевести все содержимое в 16-ричную систему..
У меня так и не получилось даже вывести на экран содержимое файла.. А о переводе в HEX вообще молчу.. Помогите пожалуйста))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2014, 15:29
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Чтение файла GIF. Перевод текста в HEX. Декодирование GIF анимации (C++):

Задержка кадров анимации gif - C++
Я недавно начал изучать си++.. Требуется программа, входными данными которой является gif анимация. Из неё извлекаются значения задержки,...

Builde C++, вставка GIF анимации. - C++
Можно ли каким-либо образом вставить на форму GIF анимашку?

Чтение английского текста из файла,выделение слов и перевод - C++
Всем привет! Есть такая задача: считать из входного файла английский текст,выделить в нем все слова и записать в выходной файл с переводом....

Чтение файла и запись в HEX - C++
Доброго времени суток. Надеюсь на Вашу помощь, ибо у самого мозгов уже хватает. Имеем задачу: открыть файл lesson.txt, указанный в...

Чтение файла как hex - C++
Как открыть файл в 16ричном виде? Насколько я понял это средствами только с++ невозможно ... или всё же возможно? Вообще хотелось бы...

GIF-анимация - C++
Здравствуйте, программисты. Недавно поставил С++ 2007, в котором у компоненты TImage есть поддержка GIF.Поддержка есть, но фактически...

14
Alexandr_1982
178 / 76 / 17
Регистрация: 04.11.2013
Сообщений: 398
Записей в блоге: 4
15.11.2014, 15:44 #2
Чтение файла:
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
#include <stdio.h>
#include <windows.h>
 
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "kernel32.lib")
#pragma comment(lib, "gdi32.lib")
 
 
void main()
{
int i;
HANDLE h;
unsigned char r[16];
DWORD d;
DWORD rd;
 
rd = 0;
 
h = CreateFile("t.exe", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL);  
ReadFile(h, r, 16, &d, 0);
rd+=d;
while(d > 0)
{
for(i = 0; i < 16; i++)
{
if ( r[i] <= 0xf)
printf("0%x ", r[i]);
else
printf("%x ", r[i]);
}
for(i = 0; i <16; i++)
printf("%c", r[i]);
printf("\n");
ReadFile(h, r, 16, &d, 0);
rd+=d;
}
printf("\nread: %d\n", rd);
}
1
lenston
2 / 0 / 1
Регистрация: 12.11.2014
Сообщений: 33
15.11.2014, 16:14  [ТС] #3
Цитата Сообщение от Alexandr_1982 Посмотреть сообщение
Чтение файла:
спасибо))

Добавлено через 10 минут
Цитата Сообщение от Alexandr_1982 Посмотреть сообщение
Чтение файла:
у меня несколько вопросов..
какой компилятор у вас?
что это?
Цитата Сообщение от Alexandr_1982 Посмотреть сообщение
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "kernel32.lib")
#pragma comment(lib, "gdi32.lib")
Цитата Сообщение от Alexandr_1982 Посмотреть сообщение
HANDLE h;
h = CreateFile("t.exe", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL);
DWORD d;
DWORD rd;
Просто у меня gcc..
0
Alexandr_1982
178 / 76 / 17
Регистрация: 04.11.2013
Сообщений: 398
Записей в блоге: 4
16.11.2014, 16:10 #4
В g++ компилируется, если вместо void main написать int main и return 0; в конце main написать.
0
Kuzia domovenok
2125 / 1955 / 194
Регистрация: 25.03.2012
Сообщений: 6,804
Записей в блоге: 1
16.11.2014, 17:32 #5
lenston, читать файл можно по-разному. Можно чисто стандортными средствами С++ его открыть.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
FILE* imgFile=fopen("picture.gif", "rb");
затем читать из него по порядку бинарные данные, в соответствии с тем, что в файле лежит. Например, 
/*прочитать int*/
int number;
fread(&number, sizeof(int), 1, imgFile);//число инт одна штука из файла imgFile в переменную number
/*прочитать несколько байт*/
unsigned char bytes[10];
fread(bytes, sizeof(unsigned char), 10, imgFile);//байты 10 штук из файла imgFile в переменную bytes
/*прочитать сразу блок из разных типов переменных*/
struct block{
  double ratio;
  unsigned int size;
  char bytes[15];
}data;
fread(&data, sizeof(struct block), 1, imgFile);//байты 10 штук из файла imgFile в переменную number
fclose(imgFile);
1
lenston
2 / 0 / 1
Регистрация: 12.11.2014
Сообщений: 33
17.11.2014, 16:32  [ТС] #6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
lenston, читать файл можно по-разному. Можно чисто стандортными средствами С++ его открыть.
Спасибо огромное)) опыта в си почти нет))
0
Kuzia domovenok
17.11.2014, 16:57
  #7

Не по теме:

Цитата Сообщение от lenston Посмотреть сообщение
Спасибо огромное)) опыта в си почти нет))
тогда, извиняюсь за нескромный вопрос, нафига тебе этот геморрой с файлами?

0
lenston
2 / 0 / 1
Регистрация: 12.11.2014
Сообщений: 33
17.11.2014, 17:01  [ТС] #8
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
тогда, извиняюсь за нескромный вопрос, нафига тебе этот геморрой с файлами?
В вузе дз короче.. в сях распилить гифку побитово и нарисовать массив типа

0 - белый
1 - черный
2 - еще какой - то итд

должен выглядеть примерно вот так

1 0 1 1
0 1 0 0
2 2 1 0
1 1 1 0
0
Alexandr_1982
178 / 76 / 17
Регистрация: 04.11.2013
Сообщений: 398
Записей в блоге: 4
18.11.2014, 14:48 #9
Вот примерно так разбираете файл, см. статью.
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
#include <stdio.h>
#include <math.h>
 
struct sbyte { unsigned char a; }; // байт
struct sword { unsigned short a; }; // два байта
struct sdword { unsigned int a; }; // четыре байта
struct sbyte3 { unsigned char a; unsigned char b; unsigned char c; }; // три байта
struct sbyte4 { unsigned char a; unsigned char b; unsigned char c; unsigned char d ; }; // четыре байта
 
 
int main()
{
FILE* f;
struct sbyte a;
struct sword b;
struct sdword c;
struct sbyte3 d;
struct sbyte4 e;
int f1;
unsigned char f2;
 
f = fopen("image1.gif", "rb"); // открытие gif
fread(&a, sizeof(struct sbyte), 1, f); printf("%c", a.a);
fread(&a, sizeof(struct sbyte), 1, f); printf("%c", a.a);
fread(&a, sizeof(struct sbyte), 1, f); printf("%c", a.a);
fread(&a, sizeof(struct sbyte), 1, f); printf("%c", a.a);
fread(&a, sizeof(struct sbyte), 1, f); printf("%c", a.a);
fread(&a, sizeof(struct sbyte), 1, f); printf("%c", a.a); // заголовок gif
fread(&b, sizeof(struct sword), 1, f); printf("\n%x\n", b.a); // размер 1
fread(&b, sizeof(struct sword), 1, f); printf("%x\n", b.a);  // размер 2
fread(&a, sizeof(struct sbyte), 1, f); printf("%x\n", a.a); // описание изображения
fread(&a, sizeof(struct sbyte), 1, f); printf("%x\n", a.a); // индекс цвета фона
fread(&a, sizeof(struct sbyte), 1, f); printf("%x\n", a.a); // соотношения сторон
 
f1 = 0;
 
while (fread(&d, sizeof(struct sbyte3), 1, f)  && f1 == 0) // таблица цветов
{
 printf("%x %x %x\n", d.a, d.b, d.c);
 if (d.a == '\x2c' ||  d.b == '\x2c' ||  d.c == '\x2c') f1 = 1;
}
 
while (fread(&a, sizeof(struct sbyte), 1, f) )
 printf("%x \n", a.a);
 
 
return 0;
}
1
lenston
2 / 0 / 1
Регистрация: 12.11.2014
Сообщений: 33
18.11.2014, 19:48  [ТС] #10
Цитата Сообщение от Alexandr_1982 Посмотреть сообщение
Вот примерно так разбираете файл, см. статью.
Огромное спасибо за ответы)) Пойду разбираться в коде и в статье)))

Добавлено через 3 часа 30 минут
решил для начала перевести GIF файлик в HEX..
сделал вот так))

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
#include <stdio.h> 
 
const char* open_FILE="/home/lenston/TEST.gif"; // имя gif изображения
const char* hex_FILE="/home/lenston/TEST_hex";  // имя переведенного hex изображения
FILE* _GIF;                             // gif файл
 
void  open_GIF(){                           // перевод GIF в HEX
    FILE*  f = fopen (open_FILE,"rb");
    FILE* f1 = fopen ( hex_FILE,"w" );
    int bufer;
    int count=0; 
 
    do {
        bufer= fgetc (f);
        if (bufer!=EOF) {
            fprintf (f1, "%02x%c", bufer, ' ');
            printf ("%02x%c", bufer, ' ');
        }
        count++;
        if (!(count%16)) { printf ("\n"); }
    } while (bufer!= EOF);
    fseek (f1, 1, SEEK_CUR);
    fscanf (f1, "%x", &bufer);
    fclose (f); fclose (f1);
}
чтоб было прям как в примере..

http://www.cyberforum.ru/redirector....YxMjcwODMlMkY=


а после буду пытаться сделать как предложил Alexandr_1982
0
Kuzia domovenok
2125 / 1955 / 194
Регистрация: 25.03.2012
Сообщений: 6,804
Записей в блоге: 1
19.11.2014, 21:41 #11
Цитата Сообщение от lenston Посмотреть сообщение
решил для начала перевести GIF файлик в HEX..
нафига? Тем более это не ты, а за тебя ранее эту программу перевода написал Alexandr_1982.
Но, как выясняется, для задачи декодирования GIF файла это ни коим образом не относится. Гораздо полезнее для тебя было бы посмотреть на GIF файл в hex редакторе, как это и делалось в статье.
Ты ж зачем-то по сути делаешь свой мини-hex-редактор. Зачем? Если тебе надо файл изучить, скачай один из десятков готовых гексредакторов!
Если тебе нужно файл декодировать и загрузить в программу, грузи его сразу из файла в бинарном виде в свои структуры! Нахрена ты всё в текст переводишь?
0
lenston
2 / 0 / 1
Регистрация: 12.11.2014
Сообщений: 33
19.11.2014, 23:35  [ТС] #12
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
нафига?
эт я сначала, по тупости зафигачил.. забей.. теперь читаю побайтово.. как предложили..

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
#include <stdio.h>                                      // 
                                                        // 
typedef unsigned char BYTE;                             // тип байт
const char*         open_FILE="/home/lenston/Downloads/LED/TEST_1x1_77.gif";    // имя gif изображения
int                 _width;                             // ширина картинки
int                 _height;                            // высота картинки
struct  sbyte       {BYTE a;};                          // один байт
unsigned long int   i=0;                                // 
                                                        //
void  _dv(int n){                                       // перевод байта в двоичку
    int i=7;char buffer[]="00000000";
    do {int x=n%2;n=n/2; char z;
            if( x<10 )  z='0'+x;
            else        z='A'-10+x;
        buffer[i]=z; i--;
    } while (n>0); printf("%s",buffer);
}
void     decod(){                                       // декодирование
    struct palette {                                // палитра
        bool CT;                                // - глобальная палитра
        BYTE Color;                             // - цветовое разрешение исходной картинки
        bool SF;                                // - флаг сортировки палитры
        BYTE Size;                              // - размер палитры
    };                                      //
    BYTE BG;                                // индекс цвета фона
    BYTE R;                                 // соотношение сторон исходного изображения
    sbyte a;                                // байт
    palette p;                              // палитра
    FILE*  f = fopen (open_FILE,"rb");      // файл gif
    
//Заголовок
    printf("\ngif формат - ");for(i=0;i<6;i++){fread(&a,sizeof(sbyte),1,f);printf("%c",a.a);}           //0-5 формат gif //для анимации GIF89a
//Logical Screen Descriptor
    fread(&a,sizeof(sbyte),1,f);_width = a.a;fread(&a, sizeof(sbyte), 1, f);                            //6-7 ширина
    fread(&a,sizeof(sbyte),1,f);_height= a.a;fread(&a, sizeof(sbyte), 1, f);                            //8-9 высота
        printf("\nразмер картинки = %ix%i ",_width,_height);                                            //
    fread(&a,sizeof(sbyte),1,f);printf("\nпалитра = %02X: ",a.a);_dv(a.a);                              //10 палитра:                       // не будет зависеть, просто пропустим и заполним как надо, ибо нехуй
        p.CT=1;             // - глобальная палитра                                                     - ИСПОЛЬЗУЕТСЯ
        p.Color=16;         // - цветовое разрешение исходной картинки                                  - КОЛИЧЕСТВО ЦВЕТОВ =16
        p.SF=0;             // - флаг сортировки палитры                                                - ЦВЕТА НЕ ОТСОРТИРОВАНЫ
        p.Size=3*p.SF;      // - размер палитры                                                         - РАЗМЕР В БАЙТАХ
    fread(&a,sizeof(sbyte),1,f);BG=a.a;printf("\nиндекс цвета фона - %02X",BG);                         //11 цвет фона
    fread(&a,sizeof(sbyte),1,f);R=a.a;printf("\nсоотношение сторон - %02X",R);                          //12 соотношение сторон
//Global Color Table
    printf("\n\nGlobal Color Table RGB\n");i=0;                                                         //13-60 RGB
    while (a.a!=0x2c){i++;fread(&a,sizeof(sbyte),1,f);printf("%02X ",a.a);if(i==3){printf("\n");i=0;}}  //Table RGB
//image Descriptor
    
}
                                                        //
int       main(){                                       // 
    decod();
    return 0;
}
выводит уже вот это

Чтение файла GIF. Перевод текста в HEX. Декодирование GIF анимации
0
lenston
2 / 0 / 1
Регистрация: 12.11.2014
Сообщений: 33
19.11.2014, 23:42  [ТС] #13
застрял сейчас на LZW..

пользуюсь этими сайтами (вдруг кто-нибудь этим же будет заниматься)

http://home.onego.ru/~chiezo/gif.htm
http://habrahabr.ru/post/127083/
http://2danimator.ru/showthread.php?t=4008
http://www.daubnet.com/en/file-format-gif

еще нашел декодер GIF LZW.. медленно пытаюсь разобраться..
http://www.nightmare.com/squirl/python-ext/misc/giflzw.c
0
lenston
2 / 0 / 1
Регистрация: 12.11.2014
Сообщений: 33
19.11.2014, 23:43  [ТС] #14
выгладит код вот так

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
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
#include "allobjects.h"
 
#define SAFE_FREE(thing) do { if ((thing)) {free ((thing));}} while (0)
 
#ifdef DEBUG_GIFLZW
#define DEBUG_FPRINTF(args) do { fprintf args; } while (0)
#else
#define DEBUG_FPRINTF(args)
#endif
 
static object *ErrorObject;
 
static unsigned int bit_slice_table[8][9];
 
static void
fill_bit_slice_table (void)
{
  int i;
  int j;
 
  for (i=0; i < 8; i++) {
    for(j=0; j < 9; j++) {
      if (j < (9 - i)) {
    bit_slice_table[i][j] = (((1 << j) - 1) << i);
      } else {
    bit_slice_table[i][j] = 0;
      }
    }
  }
}
 
typedef struct {
  unsigned char *   data_table;
  unsigned int *    prefix_table;
  unsigned char *   data_stack;
  size_t        stack_index;
  unsigned char *   input;
  size_t        input_length;
  unsigned char     bit_pos;
  unsigned int      byte_pos;
  unsigned char     first_of_last;
  unsigned int      initial_code_size;
} gif_lzw_decoder;
 
typedef struct {
  PyObject *        string_object;
  unsigned char *   data;
  unsigned char *   row;
  int           pass;
  int           xpos;
  int           ypos;
  int           width;
  int           height;
  int           interlaced;
  size_t        count;
} gif_output;
 
 
static
gif_output *
new_output (int width, int height, int interlaced)
{
  gif_output * go;
 
  go = (gif_output *) malloc (sizeof(gif_output));
  go->width = width;
  go->height = height;
  go->interlaced = interlaced;
  go->xpos = go->ypos = go->count = go->pass = 0;
 
  go->string_object = PyString_FromStringAndSize (NULL, width * height);
  if (!(go->string_object)) {
    free (go);
    return NULL;
  }
  go->data = (unsigned char *) PyString_AsString (go->string_object);
  go->row = go->data;
  return (go);
}
 
static
void
free_output (gif_output * go)
{
  Py_DECREF (go->string_object);
  free (go);
}
 
/*
 * return the bitfield of length <code_size> at position <bit_pos>
 * in byte <byte_pos>, using bit_slice_table.  Modifies <byte_pos>
 * and <bit_pos> to point to the next bitfield.
 */
 
static int
get_code (gif_lzw_decoder * gld,
      int code_size)
{
  int result=0;
  int left=code_size;
  int slice_len;
  int slice;
 
  while (left > 0) {
    slice_len = (left < (8 - gld->bit_pos) ? left : (8 - gld->bit_pos));
    slice = ((((unsigned char)(gld->input[gld->byte_pos]))
          & bit_slice_table[gld->bit_pos][slice_len])
         >> gld->bit_pos) << (code_size - left);
    result = result | slice;
    left = left - slice_len;
    gld->bit_pos = (gld->bit_pos + slice_len) % 8;
    if (gld->bit_pos == 0) {
      (gld->byte_pos)++;
    }
  }
  return result;
}
 
#define GIF_MAXBITS 12
 
static void
reset_decoder (gif_lzw_decoder * gld)
{
  int i;
  for (i=0; i < (1<<GIF_MAXBITS); i++) {
    /* fill the data table */
    if (i < (1<<(gld->initial_code_size))) {
      gld->data_table[i] = (unsigned char)i;
    } else {
      gld->data_table[i] = 0;
    }
    /* fill the prefix table */
    gld->prefix_table[i] = 0;
  }
}    
 
static int
initialize_decoder (gif_lzw_decoder * gld,
            unsigned int code_size)
{
  gld->bit_pos = 0;
  gld->byte_pos = 0;
  gld->stack_index = 0;
  gld->data_table = (unsigned char *) malloc (sizeof(unsigned char) * (1<<GIF_MAXBITS));
  if (!(gld->data_table)) {
    return 0;
  } else {
    gld->prefix_table = (unsigned int *) malloc (sizeof(unsigned int) * (1<<GIF_MAXBITS));
    if (!(gld->prefix_table)) {
      free (gld->data_table);
      return 0;
    } else {
      gld->data_stack = (unsigned char *) malloc (sizeof(unsigned char) * (1<<GIF_MAXBITS));
      reset_decoder (gld);
      return 1;
    }
  }
}
 
static void
free_decoder (gif_lzw_decoder * gld)
{
  SAFE_FREE (gld->data_table);
  SAFE_FREE (gld->prefix_table);
  SAFE_FREE (gld->data_stack);
  free (gld);
}
 
/* maybe: reverse stack and write codes out atomically */
 
static void
output_code (gif_lzw_decoder * gld,
         gif_output * go,
         unsigned int code)
{
  /*
   * code strings are built in reverse, so as we
   * travel the prefix table, we push each byte onto
   * a stack
   */
   
  while (1) {
    gld->data_stack[(gld->stack_index)++] = gld->data_table[code];
    if (gld->prefix_table[code] != 0) {
      code = gld->prefix_table[code] - 1;
    } else {
      gld->first_of_last = code;
      break;
    }
  }
    
  /*
   * now we reconstruct the string by popping it all
   * off the stack
   */
  
  while (gld->stack_index) {
    gld->stack_index--;
    go->row[go->xpos] = gld->data_stack[gld->stack_index];
    (go->count)++;
    DEBUG_FPRINTF ((stderr, "%d ", (int) go->row[go->xpos]));
    (go->xpos)++;
    if ((go->xpos) == (go->width)) {
      (go->xpos) = 0;
      /* handle interlaced data */
      if (go->interlaced) {
    do  {
      switch ((go->pass)) {
      case 0:
      case 1:
        (go->ypos) += 8;
        if (go->ypos >= go->height) { (go->pass)++; go->ypos = 4; }
        break;
      case 2:
        (go->ypos) += 4;
        if (go->ypos >= go->height) { (go->pass)++; go->ypos = 2; }
        break;
      case 3:
        (go->ypos) += 2;
        if (go->ypos >= go->height) { (go->pass)++; go->ypos = 1; }
        break;      
      }
      /* this extra check is necessary for images of only a few lines */
    } while (((go->ypos) >= go->height) && (go->pass < 5));
      } else {
    (go->ypos)++;
      }
      (go->row) = go->data + (go->ypos * go->width);      
    }
  }
}
 
static PyObject *
py_giflzw_decode (PyObject * self, PyObject * args)
{
  gif_lzw_decoder   * gld;
  gif_output    * go;
  int       code_size;
  unsigned int  clear_code, orig_code, code, last_code, next_code, max_code;
  unsigned int  width, height, interlaced;
  PyObject *    result;
 
  /* try to allocate a new decoder */
  gld = (gif_lzw_decoder *) malloc (sizeof(gif_lzw_decoder));
  
  if (!gld) {
    PyErr_SetString (PyExc_MemoryError, "couldn't allocate decoder");
    return NULL;
  }
 
  /* parse the args */
  if (!PyArg_ParseTuple (args, "s#iiii",
             &(gld->input),
             &(gld->input_length),
             &(gld->initial_code_size),
             &width,
             &height,
             &interlaced)) {
    return NULL;
  }
  
  /* try to allocate the output string */
  go = new_output (width, height, interlaced);
 
  if (!go) {
    free_decoder (gld);
    PyErr_SetString (PyExc_MemoryError, "couldn't allocate output string");
    return NULL;
  }
 
  /* try to initialize the decoder */
  if (!initialize_decoder (gld, gld->initial_code_size)) {
    free_decoder (gld);
    free_output (go);
    PyErr_SetString (PyExc_MemoryError, "couldn't allocate decoder tables");
    return NULL;
  }
 
  code_size = gld->initial_code_size;
  clear_code = 1<<code_size;
  next_code = clear_code + 2;
  max_code = (1<<(code_size+1)) - 1;
  
#define BARF_RETURN(message)                \
  do { free_decoder (gld);              \
       free_output (go);                \
       PyErr_SetString (PyExc_ValueError, (message));   \
       return NULL;                 \
     }                          \
    while (0)
 
  /* read the clear code */
  code = get_code (gld, code_size+1);
  
  DEBUG_FPRINTF ((stderr, "clear code %d\n", code));
  if (code != clear_code) {
    BARF_RETURN ("invalid GIF LZW data stream (didn't start with clear code)");
  }
  
  /* read the first code */
  last_code = get_code (gld, code_size+1);
  /* output the code */
  output_code (gld, go, last_code);
 
  while (1) {
 
    if (gld->byte_pos >= gld->input_length) {
      BARF_RETURN ("read past data with seeing end code");
    }
 
    code = orig_code = get_code (gld, code_size+1);
 
    DEBUG_FPRINTF ((stderr, "\ncode: %d\n", code));
 
    if (code == clear_code) {
      DEBUG_FPRINTF ((stderr, "***** clear code found *****\n"));
      code_size = gld->initial_code_size;
      clear_code = 1 << code_size;
      next_code = clear_code + 2;
      max_code = (1<<(code_size+1)) -1;
      reset_decoder (gld);
      code = last_code = get_code (gld, code_size+1);
      output_code (gld, go, code);
      continue;
    } else if (code == clear_code + 1) {
      DEBUG_FPRINTF ((stderr, "***** end code found *****\n"));
      DEBUG_FPRINTF ((stderr, "%ld bytes written\n", (long) gld->byte_pos));
      break;
    } else if (code == next_code) {
      /* special case for KwKwK */
      output_code (gld, go, gld->first_of_last);
      code = last_code;
    }
      
    output_code (gld, go, code);
 
    if (next_code != (1<<GIF_MAXBITS) - 1) {
      /* add a new code to the chain */
 
      gld->prefix_table[next_code] = last_code + 1;
      gld->data_table[next_code] = gld->first_of_last;
      next_code = next_code + 1;
 
      if (next_code > max_code) {
    code_size = code_size + 1;
    max_code = (1<<(code_size+1)) - 1;
      }
    }
    last_code = orig_code;
  }
 
  if (go->count != width*height) {
    BARF_RETURN ("not enough decoder output, premature end code found");
  } else {
    free_decoder (gld);
    result = go->string_object;
    Py_INCREF (result);
    free_output (go);
  }
  return (result);
}
  
/* List of functions exported by this module */
static struct PyMethodDef giflzw_functions[] = {
  {"decode",    py_giflzw_decode,   1},
  {NULL, NULL}          /* Sentinel */
};
 
/* Initialization function for the module (*must* be called initgiflzw) */
 
void
initgiflzw()
{
  PyObject *m, *d;
 
  /* Create the module and add the functions */
  m = Py_InitModule("giflzw", giflzw_functions);
 
  /* Add some symbolic constants to the module */
  d = PyModule_GetDict(m);
  ErrorObject = PyString_FromString("giflzw error");
  PyDict_SetItemString(d, "error", ErrorObject);
 
  fill_bit_slice_table();
 
  /* Check for errors */
  if (PyErr_Occurred())
    Py_FatalError("can't initialize module giflzw");
}
если кто сможет пояснить мне это, то было бы шикарно))
0
lenston
2 / 0 / 1
Регистрация: 12.11.2014
Сообщений: 33
20.11.2014, 08:56  [ТС] #15
можете объяснить, пожалуйста, что именно читает этот кусок))??
Цитата Сообщение от Alexandr_1982 Посмотреть сообщение
C
1
2
while (fread(&a, sizeof(struct sbyte), 1, f) )
*printf("%x \n", a.a);
0
20.11.2014, 08:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2014, 08:56
Привет! Вот еще темы с ответами:

Разобрать GIF файл по пикселям и вывести в матрицу - C++
Требуется разобрать GIF файл по пикселям и вывести на матрицу. У кого нибудь есть опыт работы с GIF файлами на уровне программы. ...

HEX viewer: создать программу для чтения из файла текста в обычном режиме и в шестнадцатеричном - C++
нужно создать программу для чтения из файла текста и выписывания его в обычном режиме и в шестнадцатеричном. кроме того нужно сделать Pg Up...

просмотр графического образа (jpeg,gif и т.д.)с возможностью %-ого масштабирования? - C++
кaктo мне тaкoй тест зaдaли... дo сих пoр этим людей пугaю. мoжет ктo встерчaл пoдoбнoе

Если HEX одного файла заменить на HEX другого, то изменится ли файл и будет ли работоспособным? - C++
Привет, если два файла a.exe(калькулятор) и b.exe(выводит строку &quot;Hello World&quot;) Если открыть файл b.exe в HEX-редакторе и подменить его...


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

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

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