gpt4 book ai didi

图像的转换--->二进制--->图像使用C

转载 作者:太空宇宙 更新时间:2023-11-04 07:06:36 29 4
gpt4 key购买 nike

对于使用 C 编程的项目,我们正在尝试将图像转换为二进制数据,反之亦然。我们在网上找到的所有其他解决方案都是用 C++ 或 Java 编写的。这是我们尝试过的方法:

  1. 将图像转换为包含二进制数据的文本文件。使用文本编辑器打开图片时,每8个字符对应一个字符字节。

  2. 然后我们尝试使用 C 程序将二进制数据重新转换为其各自的字符。

  3. 然后我们使用 Picasa 照片查看器打开结果。我们得到一个无效的图像。

我们如何取回原始图像?这是我们用来将图像转换为文本文件的代码:

#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 文件时,我们得到一个无效的图像。当我们使用文本编辑器打开这个新文件以及使用文本编辑器打开图像文件时,我们得到相同的字符。

最佳答案

图片转文本文件

fptr=fopen("D:\\aa.bmp","r");

BMP 文件必须以二进制模式("rb")打开以确保正确读取字节值。 "r" mode 以文本模式打开文件,这可能会导致某些字符被转换,从而导致输出损坏。

例如,在 Windows(或至少是 DOS)上,行尾将从 "\r\n" 转换而来至 "\n"和字符 "\x1a"可能被解释为 and EOF指示符并截断您的输入。

另一方面,在类 UNIX 系统上没有区别。


do
{
c=fgetc(fptr);
for(int i=0;i<=7;i++)
{
/* ... */
}
// fprintf(txt,"\t");
}while(c!=EOF);

这个循环是完全错误的。您需要检查 EOF 在循环的顶部。当fgetc()返回 EOF ,您的代码将采用 EOF值(通常为 -1 ),并在退出循环之前输出相应的 1 和 0。这也会破坏您的输出。

相反,你应该这样做:

while ((c = fgetc (fptr)) != EOF) {
{
/* ... */
}

如果您对同一个表达式中的赋值和比较感到不舒服,有一个解决方法:

while (1)
{
c = fgetc (fptr);
if (c == EOF)
break;
/* ... */
}

另请注意 fgetc()还返回 EOF错误。您应该对此进行测试 (if (ferror (fptr))) 并将问题报告给用户。


fclose(fptr);
fclose(txt);

应该检查 fclose() 的返回值并向用户报告任何错误,至少在输出流上。在某些文件系统上,直到流关闭后,最后的输出才会写入磁盘,写入它的任何错误都将由 fclose() 报告。 .参见 "What are the reasons to check for error on close()?"了解当您不这样做时会发生什么的启发性故事。

文本文件转图片

image=fopen("D:\\aa2.bmp","w"); //open an empty .bmp file to

必须如上所述使用二进制模式("wb")。


char bytefromtext(char* text) 
{
char result=0;
for(int i=0;i<8;i++)
{
if(text[i]=='1')
{
result |= (1<< (7-i) );
}
}
return result;
}

应该使用 unsigned char 在处理二进制数据时。平原 charsignedunsigned由实现者选择(例如编译器供应商)。

如果值存储在result不能在 signed char 中表示(如 1<<7 ),结果是定义的实现。这在理论上可能会破坏您的输出。虽然我认为您的代码在大多数情况下可能会按预期工作,但您仍应使用 unsigned char作为原则问题。

(当然,这假设 char 不大于 8 位,这通常是这种情况。)


char c;

/* ... */

c=fgetc(pfile);

while(c!=EOF)
{
/* ... */

c=fgetc(pfile);
}

这个循环是错误的还有另一个原因。如果普通 char恰好是无符号的,c永远比较等于EOF它始终具有负值。你应该使用 int变量,针对 EOF 进行测试, 然后才将该值用作字符值。


fclose(pfile);
fclose(image);

您应该如上所述检查返回值。

其他问题

我对您的代码还有其他一些疑问。

  • 在 C 中,main() 始终 返回 int , 你应该返回一个适当的值来指示成功或失败。 (这不适用于独立环境,例如在没有操作系统的情况下运行的 C 程序。)

  • 第二个程序中的评论部分使用反斜杠代替正斜杠。发布代码时,您应该始终复制/粘贴它以避免引入新的错误。

关于图像的转换--->二进制--->图像使用C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32527351/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com