Escrevendo uma imagem para um arquivo de texto como dados binários C #

votos
8

Eu preciso criar um arquivo que incorpora uma imagem como o texto dentro de alguns registros. Eu estou tendo alguns problemas para escrever as imagens como texto. O que estou fazendo é reunir a imagem como uma matriz de bytes a partir de um banco de dados SQL (tipo de imagem), então eu estou escrevendo essa imagem para um arquivo de texto, passando por cada byte e escrever ASCII equivalente desse byte para o arquivo.

Antes que eu possa escrever essa imagem para um arquivo de texto, preciso convertê-lo para um TIFF (que antigamente era um jpeg) em formato CCITT4. Para confirmar que isso está sendo feito corretamente, eu também salvar o fluxo como um TIFF e vê-la em AsTiffTagViewer, que mostra que a compressão está correto. Eu sou capaz de ver o tiff em um visualizador adequado; no entanto, ao reunir o texto do arquivo, eu sou incapaz de ver a imagem.

Aqui está o código:

byte[] frontImage = (byte[])imageReader[front_image];
MemoryStream frontMS = new MemoryStream(frontImage);
Image front = Image.FromStream(frontMS);
Bitmap frontBitmap = new Bitmap(front);
Bitmap bwFront = ConvertToBitonal(frontBitmap);
bwFront.SetResolution(200, 200);
MemoryStream newFrontMS = new MemoryStream();
bwFront.Save(newFrontMS, ici, ep);
bwFront.Save(c:\\Users\\aarong\\Desktop\\C#DepositFiles\\ + checkReader[image_id].ToString() + f.tiff, ici, ep);
frontImage = newFrontMS.ToArray();   
String frontBinary = toASCII(frontImage); 

private String toASCII(byte[] image)
{
    String returnValue = ;
    foreach (byte imageByte in image)
    {
        returnValue += Convert.ToChar(imageByte);
    }
    return returnValue;
}   

É frontBinary que está sendo gravada no arquivo. Alguém tem uma idéia sobre o que está errado? O tiff que é salvo é correta, mas a mesma matriz de bytes exata, quando escritos como texto ASCII, não está sendo escrito corretamente.

Obrigado.

EDIT Este problema foi corrigido usando um BinaryWriter (byte []) para escrever corretamente as imagens como texto. Obrigado a todos por sua ajuda!

Publicado 19/05/2009 em 22:57
fonte usuário
Em outras línguas...                            


5 respostas

votos
17

Bem ASCII é apenas sete bits, para uma coisa. No entanto, eu não acredito que o código realmente usa ASCII. É uma espécie de usa ISO-8859-1, implicitamente.

Nunca tratar o texto como versa binária ou vice. Ele vai sempre levar a problemas.

A melhor maneira de converter binário para texto ASCII é usar Base64:

string text = Convert.ToBase64String(frontImage);
byte[] data = Convert.FromBaseString(text);

Observe também que se o seu código fez o trabalho, ele ainda seria dolorosamente ineficiente - leia-se sobre StringBuilders e, em seguida, considerar que o seu código é semi-equivalente a

Encoding.GetEncoding(28591).GetString(data);

No entanto, base64 é definitivamente o caminho a percorrer para converter entre texto e dados binários sem perdas. Você precisa convertê-lo de volta para binário, a fim de ver o TIFF novamente, é claro.

Note que você não têm mostrado como você está salvando ou carregar os seus dados - você pode ter problemas lá também. Na verdade, eu suspeito que se você fosse capaz de salvar a string com precisão, você pode ter tido sorte e preservado os dados, dependendo exatamente o que você está fazendo com ele ... mas ir com base64 de qualquer maneira.

Respondeu 19/05/2009 em 22:59
fonte usuário

votos
0

Você provavelmente está lendo o banco de dados de volta como Unicode, o que irá alterar alguns dos valores binários na imagem.

Você pode usar métodos na classe System.IO.File para ler / salvar como texto e binário. Estes podem ajudar, juntamente com as opções Base64 mencionados acima.

Respondeu 19/05/2009 em 23:54
fonte usuário

votos
0

Se você estiver escrevendo apenas os dados de imagem para o arquivo, você não deve escrevê-lo como texto em tudo, mas como dados binários.

Se você está misturando texto e dados binários no arquivo, você não deve converter os dados binários em texto. Pode funcionar com algumas codificações específicas para convertê-lo e para trás, mas certamente não funciona com qualquer codificação para convertê-lo em caracteres Unicode (usando Convert.ToChar).

Fazê-lo o contrário. Codificar o texto em dados binários usando o GetBytesmétodo do próprio Encodingobjeto, de modo que você só tem dados binários para gravar o arquivo.

Respondeu 19/05/2009 em 23:21
fonte usuário

votos
0

Existe uma razão específica para que você use texto em vez de um arquivo binário?

Armazenar dados binários em arquivos de texto é sempre uma má idéia desde codificações podem converter os bytes para outra representação e caracteres especiais como avanço de linha também pode ser tratado de forma especial e convertido.

Quer armazenar os dados como matriz de bytes em um arquivo binário ou usar binário adequado para ascii conversão como proposta Base64 de Jon ou talvez uma lista de Hex-valores separados por vírgula também é possível.

Respondeu 19/05/2009 em 23:10
fonte usuário

votos
0

Uma abordagem para a obtenção de dados binários e convertê-lo em dados de texto é usar um StreamReader e fornecer a codificação desejada. Como Jon mencionado acima não é prudente usar ASCII, mas no caso de qualquer um quer transmitir binário para alguma outra codificação de texto, aqui é algum código para fazê-lo.

public static String GetString(System.IO.Stream inStream)
{
    string str = string.Empty;
    using (StreamReader reader = new StreamReader(inStream, System.Text.ASCIIEncoding.ASCII)) // or any other encoding.
    {
        str = reader.ReadToEnd();
    }
    return str;
}
Respondeu 19/05/2009 em 23:02
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more