FreeBasic
Главная
Вход
Регистрация
Суббота, 21.12.2024, 18:53Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Замена функций GET и OPEN на функции библиотеки C
WQДата: Понедельник, 28.03.2016, 13:11 | Сообщение # 1
Полковник
Группа: Проверенные
Сообщений: 215
Репутация: 7
Статус: 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
Репутация: 50
Статус: 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
Репутация: 7
Статус: Offline
Спасибо! Основную мысль вроде понял, попробую переписать пример.
 
  • Страница 1 из 1
  • 1
Поиск: