Мы пытаемся преобразовать изображение в двоичные данные и наоборот для проекта с использованием программирования C. Все остальные решения, которые мы нашли в сети, написаны либо на C++, либо на Java. Вот подход, который мы пробовали:
Преобразуйте изображение в текстовый файл, содержащий двоичные данные. Каждые 8 символов соответствуют байту символа, когда изображение открывается с помощью текстового редактора.
Затем мы пытаемся преобразовать двоичные данные в соответствующие символы с помощью программы на языке C.
Затем открываем результат с помощью Picasa Photoviewer. Получаем недопустимое изображение.
Как вернуть исходное изображение? Вот код, который мы использовали для преобразования изображения в текстовый файл:
#include<stdio.h>
#include<conio.h>
void main()
{
clrscr();
FILE *fptr;
FILE *txt;
int c;
fptr=fopen("D:\\aa.bmp","r");
txt=fopen("D:\\test1.txt","w");
if(fptr==NULL)
{
printf("NOTHING In FILE");
fclose(fptr);
}
else
{
printf("success");
do
{
c=fgetc(fptr);
for(int i=0;i<=7;i++)
{
if(c&(1<<(7-i)))
{
fputc('1',txt);
}
else
{
fputc('0',txt);
}
}
// fprintf(txt,"\t");
}while(c!=EOF);
}
fclose(fptr);
fclose(txt);
printf("writing over");
getch();
}
Вот код для преобразования полученного текстового файла в файл изображения, полный двоичных символов, то есть текстовый файл только с единицами и нулями.
#include<stdio.h>
#include<conio.h>
\\The following function converts the ones and zeroes in the text file into a character.
\\For example the text file may have the 8 consecutive characters '1','0','0','0','1','0','0','0'.
\\This converts it into the character equivalent of the binary \\value 10001000
char bytefromtext(char* text)
{
char result=0;
for(int i=0;i<8;i++)
{
if(text[i]=='1')
{
result |= (1<< (7-i) );
}
}
return result;
}
void main()
{
clrscr();
FILE *pfile;
FILE *image;
char buf[8];
char c;
int j=0;
image=fopen("D:\\aa2.bmp","w"); //open an empty .bmp file to
//write characters from the source image file
pfile=fopen("D:\\test1.txt","r");
if(pfile==NULL)
printf("error");
else
{
c=fgetc(pfile);
while(c!=EOF)
{
buf[j++]=c;
if(j==8)
{
fputc(bytefromtext(buf),image);
j=0;
}
c=fgetc(pfile);
}
fclose(pfile);
fclose(image);
}
getch();
}
Мы получаем недопустимое изображение, когда символы записываются в файл .bmp. Когда мы открываем этот новый файл с помощью текстового редактора, а также файл изображения с помощью текстового редактора, мы получаем те же символы.
conio.h
. Считается плохой практикой: stackoverflow.com/questions/21329485/ - person rayryeng   schedule 11.09.2015fgetc
неправильно. Вы используете char для хранения возвращаемого значения, когда оно возвращает int. Char не может содержать все 256 значений плюс маркер EOF. Вы должны исправить это. Также проверьте файлы на наличие различий с помощью шестнадцатеричного редактора, текстовый редактор вам не сильно поможет. - person Sami Kuhmonen   schedule 13.09.2015fgetc
здесь неверно. Спасибо! - person rayryeng   schedule 13.09.2015