【发布时间】:2023-03-09 13:30:02
【问题描述】:
对于使用 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();
}
这里是将生成的文本文件转换为充满二进制字符的图像文件的代码,即只有 1 和 0 的文本文件。
#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 文件时,我们得到一个无效的图像。当我们使用文本编辑器打开这个新文件以及使用文本编辑器打开图像文件时,我们会得到相同的字符。
【问题讨论】:
-
作为二进制数据处理。
-
您的代码在处理图像数据方面不正确。位图文件在文件的开头有一个信息头,其中包含有关图像的信息。图像不仅仅是代表图像像素强度的 8 个字节的集合。 en.wikipedia.org/wiki/…。因此,您正在不正确地修改文件的标题,这就是文件无效的原因。您需要跳过标题,修改图像强度,然后使用相同的标题重新保存图像。
-
顺便说一句,请停止使用
conio.h。这被认为是不好的做法:stackoverflow.com/questions/21329485/… -
@rayryeng 它对像素没有任何作用。它将每个 8 位值转换为 8 个 1 或 0,然后将其转换回来。什么都没有修改,数据是什么都没有关系。
-
@SamiKuhmonen 啊我读源代码太快了。我以为 OP 试图显示二进制像素...没有看到有人尝试使用相同的有缺陷的思维进行重建...所以理论上这应该可行,但在这里使用
fgetc是错误的。谢谢!
标签: c image image-processing image-conversion