Форум: Форум C++Разное
Новые темы: 00
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: cgi скрипт на Си, вывод картинки
 
 автор: this_one   (16.02.2007 в 21:46)   письмо автору
 
 

Пишу CGI-script на Си в среде MS VC .NET 2003, использую Денвер 2.0

Суть скрипта:
- читаем картинку из файла
- выводим в stdout заголовок MIME, мол выводим картинку
- передаем в stdout картинку без изменений (файл без изменений)

В результате в браузерах FF 2, Opera 9, IE 6
для 16 и 256 цветных картинок:
картинка вида
.........|
.........|
.........|
------------------
.........|
.........|
.........|
превращается в

.............. /
............../
............./
------------------
.........../
........../
........./

(точек нет, просто иначе стираются пробелы)

При этом в браузере картинка имеет верные значения высоты и ширины, но становится больше на !!!"число строк в изображении"!!! байт. Для 24-битных картинок искажения не происходит. Проверял с помощью Total Commander характер несовпадения файлов передаваемого и того что в браузере "образовалось" (использовал "сохранить как", чтобы получить из картинки в браузере файл для сравнения) - закономерностей в различиях (а они есть) файлов не выявил.

Код на Си:


//определение размера файла
int file_size(char* InpFN)
{
FILE *tmp = fopen(InpFN, "r");
if (tmp == NULL)
return -1;
fseek(tmp, 0L, SEEK_END);
int flen = ftell(tmp);
fclose(tmp);
return flen;
}




void main(void)
{
//выделение памяти под картинку
int fsize = file_size("image.bmp");
char *image = (char *) malloc (fsize);
//чтение картинки в ОЗУ
FILE *fin = fopen("image.bmp","rb");
fread(image, fsize, 1, fin);
fclose(fin);
//проверка правильности чтения файла с картинкой
FILE *fout = fopen("image_out.bmp","wb");
fwrite(image, fsize, 1, fout);
fclose(fout);

//передача браузеру картинки
printf("Content-type: image/bmp\n\n");
fwrite(image, fsize, 1, stdout);
free(image);
//проверка правильности определения размера картинки в байтах
FILE *flog = fopen("log.txt","w");
fprintf(flog, "fsize = %d", fsize);
fclose(flog);
}


Программа в данном виде - начальный этап, просто хочу научиться передавать изображение с помощью cgi скрипта на си, чтобы браузер его правильно отображал, ан здесь уже начались проблемы.
Конечная цель - написание на Си CAPTCHAи.

  Ответить  
 
 автор: cheops   (16.02.2007 в 23:01)   письмо автору
 
   для: this_one   (16.02.2007 в 21:46)
 

Хм... действительно есть такое дело, причём отправка заголовка Content-Length, а также использование new и delete вместо malloc() и free() не исправляют ситуацию... похоже либо глюк в apache, либо 16 и 256 цветные изображения нужно как-то подготавливать перед отправкой. Попробуйте перезагрузить изображение - такое ощущение, что где-то утечка памяти? Вы кстати, apache какой версии используете?

  Ответить  
 
 автор: this_one   (16.02.2007 в 23:54)   письмо автору
6.4 Кб
 
   для: cheops   (16.02.2007 в 23:01)
 

спасибо, cheops

можно удалять тему

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования