WQ | Дата: Понедельник, 28.03.2016, 13:11 | Сообщение # 1 |
Полковник
Группа: Проверенные
Сообщений: 215
Статус: Offline
| Есть такой код загрузки файла GIF https://www.freebasic-portal.de/code-be....0.html
Код не без недостатков, но относительно небольшой и кроссплатформенный. Проблема - в использовании функции OPEN и далее GET. Под Win в случае наличия в пути Unicode-символов файл не открыть.
Как бы заменить Open и Get на функции fopen (далее можно будет использовать _wfopen) и fread из crt.bi? Хотя бы для этих строк получения высоты и ширины файла:
Код Open FileName For Binary Access Read As #FF
'GIFWidth (0-16000) Dim GIFWidth As Integer Get #FF, 7,ReadByte GIFWidth= ReadByte Get #FF, 8,ReadByte GIFWidth += ReadByte Shl 8
'GIFHeight (0-16000) Dim GIFHeight As Integer Get #FF, 9,ReadByte GIFHeight = ReadByte Get #FF,10,ReadByte GIFHeight += ReadByte Shl 8
Нашел еще пример на C++
Код #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; } Не получется его на FB перевести.
Да, есть еще GIFLIB, но там, во-первых проблемы с кроссплатформенностью, во-вторых, тоже не получется загрузить файл с Unicode-символами в пути.
|
|
| |
haav | Дата: Понедельник, 28.03.2016, 15:09 | Сообщение # 2 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Цитата WQ ( ) Как бы заменить Open и Get на функции fopen (далее можно будет использовать _wfopen) и fread из crt.bi? Хотя бы для этих строк получения высоты и ширины файла:
Код #Include "crt.bi"
Dim As FILE Ptr FF
FF = fopen(FileName, "r") if FF = NULL Then print "Error open file!" Sleep End EndIf
'GIFWidth (0-16000) Dim GIFWidth As Short fseek(FF,6,SEEK_SET) fread (@GIFWidth, 2,1,FF)
'GIFHeight (0-16000) Dim GIFHeight As Short fread (@GIFHeight, 2,1,FF)
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
WQ | Дата: Вторник, 29.03.2016, 15:11 | Сообщение # 3 |
Полковник
Группа: Проверенные
Сообщений: 215
Статус: Offline
| Спасибо! Основную мысль вроде понял, попробую переписать пример.
|
|
| |