yagami_md Ответов: 3

Как можно прочитать изображение с помощью fopen () с помощью языка C


когда я попытался прочитать изображение в c с помощью функции fopen () после того , как я попытался перенести его в таблицу, некоторые пиксели (caracter) не могут перенести и только trasfert неправильно
пример какой-то пиксель в изображении, когда я открыл его с помощью блокнота= " XGll® ® is(VGuë åëïëëïåëïìë")
в разделе будет "ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"
где же проблема?

Что я уже пробовал:

голец** вкладке;
nb=1;
longth=(размер изображения) вычисляется функцией fseek

pfile= " image.pgm";

tab=(char**)malloc ((nb)*sizeof(char*));

fp=fopen(pfile, " r");

для (i=0;i & lt; nb; i++)>
{
tab[i]=(char*)malloc ((40)*sizeof(char));
}

ff=fopen(tab[i], " w");

для (j=0;j< longth; j++)>
{
c=fgetc(fp);

fputc ((char)c, ff);
}
fclose(ff);
fclose(fp)

3 Ответов

Рейтинг:
21

OriginalGriff

Для начала, прекратите использовать char, и использовать unsigned char - вы можете потерять данные в верхнем бите.
Во-вторых, прекратите использовать fgetc и fputc - они предназначены для символьных данных, а изображения-нет. Вместо этого используйте fread и fwrite:
C библиотечная функция fread()[^]
C библиотечная функция fwrite()[^]
Оба они предназначены для двоичных данных.
Я также читал и записывал его "кусками", а не отдельными значениями символов / байтов.

Но... вы понимаете, что у вас нет никаких имен файлов в вашем массиве вкладок, когда вы используете его для открытия файлов? Вам действительно нужно проверять возвращаемые значения из fopen каждый раз, когда вы его используете...


Рейтинг:
2

Patrice T

ваша программа действительно странная, вы тратите половину программы на выделение памяти, чем не пользуетесь.
Несколько ссылок для изучения основ C/C++ :
Язык программирования Си - Википедия, свободная энциклопедия[^]
https://hassanolity.files.wordpress.com/2013/11/the_c_programming_language_2.pdf[^]
http://www.ime.usp.br/~ПФ/Керниган-Ритчи/с-Программирование-электронные книги.формат PDF[^]


yagami_md

нет, после того, как я использую все, это часть моего большого проекта

Рейтинг:
12

Jochen Arndt

Вы работаете с файлом, содержащим двоичные данные. Чтобы избежать проблем при обработке двоичных данных, следует использовать unsigned char скорее, чем char буфера.

По той же причине fegtc() и fputc() использовать int как возвращаемое значение и параметр. Так почему же вы бросаете значение, которое должно быть записано?

fputc((char)c,ff);

Когда c если больше 127 (MSB байта установлен), то MSB будет очищен вашим приведением, записывающим другое значение (значение 128 / 0x80 станет нулем, 129 / 0x81 станет 1 и так далее). Просто передать c без литья и fputc() функция запишет правильное значение. Если вы хотите сделать что-то со значением, зависящим от знака (например, сдвиг), объявите c как тип без знака.

При использовании Windows вы также должны открыть файл в двоичном режиме ("rb "соотв."wb").

Ваш опубликованный код является неполным, и неясно, чего вы хотите достичь. Так что больше помощи оказать невозможно.


yagami_md

так ты :)