| Пишу 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и. | |