Jump to content
  • 0

Вывод картинки в виде потока битов(язык Си)


k0d
 Share

Question

Хочу вывести картинку как поток битов в браузер.

Делаю это через язык Си, разумеется программа работает как CGI-сценарий. Компилятор - MS Visual C++;

Раз мы используем CGI, то нам достаточно открыть поток для файла с картинкой (в режиме binary) и перенаправить его на stdout (стандартный поток вывода в языке Си, для тех кто не в теме) тоже в режиме binary. Что ж задача ясна, осталось черкнуть код. Вот он:


#include <stdio.h>
//Прототипчик
long filesize(FILE *f);

void main()
{
int str;
// Открываем потоки в режиме бинарного чтения и записи (обязательно!).
FILE *f = fopen("left.png", "rb");
FILE *st = fdopen(fileno(stdout), "wb"); //Обычно, stdout и так нам доступен... Это крик отчаяния, так как не знаю в чем проблема
// Выводим необходимые заголовки в браузер
printf("Pragma: no-cache\n");
printf("Content-type: image/png\n");
printf( "Content-length: %d\n", filesize(f));
printf("\n");

int c;
while ((c = getc(f)) != EOF) { //Копируем потоки, oldschool []
putc(c, st);
}
}
long filesize(FILE *f) {
long pos, size;
pos = ftell(f);
fseek(f, 0, 2);
size = ftell(f);
fseek(f, pos, 0);
return size;
}

Теперь о грустном.... Не все картинки выводятся и я не знаю в чем проблема. Уточню...

Берем, например вот _http://rghost.ru/46434752 этот фавикон

Выводим http://rghost.ru/46434807 - все норм

А если воткнуть туда другое изображение(большего размера, как мне кажется), то получаем сообщение, что картинка повреждена.... В общем прошу помощи... Искал инфу в литературе - нашел нечто подобное у Котерова (PHP5 в подлиннике), там был исходник, но он не работает... Точнее работает точно так же как и мой(выводит только этот фавикон), только юзает буфер на 4000 байт, что есть плохо... Если кому надо, то могу выложить листинг.. Причем в книге написано, что они не приводят полный листинг из-за "обилия технических подробностей"... Тоже мне отговорка, как будто я лох какой-то....

Edited by k0d
Link to comment
Share on other sites

0 answers to this question

Recommended Posts

There have been no answers to this question yet

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy