我读取JPEG图像文件并将其位存储到文本文件中。现在我想使用文本文件中的那些位转换回有效的JPEG图像。我试过写一个二进制文件,但它没有检索图像文件。
请引导我朝正确的方向前进。我已经把头埋进了这几天,但到目前为止还没有运气。
这是我编写JPG文件的代码:
int length;
unsigned char *inData;
char Buffer[9];
int c = 0, x;
/* file.txt has single bit per line. */
FILE *reader = fopen(file.txt, "r");
FILE *writer = fopen("output.JPG","wb");
fseek(reader, 0, SEEK_END);
length=ftell(reader);
fseek(reader, 0, SEEK_SET);
for(x=0; x < length; x++){
fscanf(reader, "%d", &inData);
if(c <= 8){ /* reading 8-bits */
Buffer[c] = inData;
} else {
fwrite(&Buffer, sizeof(Buffer), 1, writer);
c = 0;
}
c++;
}
fclose(reader);
fclose(writer);
以下是用于读取input.JPG并将其位写入file.txt的代码片段
char *buffer;
int fileLen;
FILE *file = fopen("inputIM.JPG", "rb");
fseek(file, 0, SEEK_END);
fileLen=ftell(file);
fseek(file, 0, SEEK_SET);
buffer=(char *)malloc(fileLen+1);
fread(buffer, fileLen, 1, file);
fclose(file);
convertToBit(&buffer, fileLen);
free(buffer);
}
// convert buffer data to bits and write them to a text file
convertToBit(void *buffer, int length)
{
int c=0;
int SIZE = length * 8;
unsigned char bits[SIZE + 1];
unsigned char mask = 1;
unsigned char byte ;
int i = 0;
FILE *bitWRT = fopen("file.txt", "w");
for (c=0;c<length;c++)
{
byte = ((char *)&buffer)[c];
for(i = 0; i < 8; i++){
bits[i] = (byte >> i) & mask;
fprintf(bitWRT, "%d\n", bits[i]);
}
}
fclose(bitWRT);
}
谢谢,
萨姆
答案 0 :(得分:2)
尝试重写如下(请注意,这是一个非常天真且未经测试的实现):
FILE* pInput = fopen("file.txt", "r");
FILE* pOutput = fopen("output.JPG","wb");
unsigned char index = 0, byte = 0;
char line[32]; // Arbitrary, few characters should be enough
while (fgets(line, sizeof(line), pInput))
{
if (line[0] == '1')
byte = (unsigned char)(byte | (1 << index));
if (++index == 8)
{
fwrite(&byte, 1, 1, pOutput);
index = 0;
byte = 0;
}
}
fclose(pInput);
fclose(pOutput);
假设:输入文件的每个行都是原始文件的单个位(这意味着如果原始文件是,例如,1024字节,那么你将在文本文件中有1024 * 8 = 8192行)。请注意,由于行终止符和(可能)不同的编码,文件的总长度将更长(至少加倍)。
修改强> 要写你可以使用这样的东西:
void convertToBit(void* pBuffer, size_t length)
{
FILE* pOutput = fopen("file.txt", "w");
for (size_t i=0; i < length; ++i)
{
unsigned char byte = (unsigned char)pBuffer[i];
for (int bitIndex=0; bitIndex < 8; ++bitIndex)
{
if ((byte & (1 << bitIndex)) != 0)
fputs("1\n", pOutput);
else
fputs("0\n", pOutput);
}
}
fclose(pOutput);
}
答案 1 :(得分:0)
必须考虑一件重要的事情,每个文件在开头都有标题,最后是页脚。 jpeg标头是FF D8,所以如果你只是写入文件,你可以破坏这个标题,文件将被破坏。
另一个重要的事情,如果你想读取一个imagem文件,你有没有尝试过使用fread()/ fwrite的二进制模式,而不是试图用最初设计为读/写的函数读取它的内容caracters? (我不知道,也许我在这里说些蠢事,但我会试一试)
抱歉我的英语很差......