Запись изображения в текстовый файл в виде двоичных данных C # - PullRequest
8 голосов
/ 20 мая 2009

Мне нужно создать файл, который встраивает изображение в виде текста в некоторые записи. У меня возникли проблемы с записью изображений в виде текста. Я собираю изображение в виде байтового массива из базы данных SQL (тип изображения), затем записываю это изображение в текстовый файл, просматривая каждый байт и записывая ASCII-код этого байта в файл.

Прежде чем я смогу записать это изображение в текстовый файл, я должен преобразовать его в формат TIFF (раньше это был jpeg) в формате CCITT4. Чтобы дважды проверить, что это делается правильно, я также сохраняю поток как TIFF и просматриваю его в «AsTiffTagViewer», который показывает, что сжатие является правильным. Я ЕСМЬ в состоянии рассмотреть TIFF в надлежащем зрителе; однако при сборе текста из файла я не могу просмотреть изображение.

Вот код:

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, который записывается в файл. Кто-нибудь имеет представление о том, что не так? Сохраненный формат tiff правильный, но точно такой же байтовый массив при записи в виде текста ASCII записывается неправильно.

Спасибо.

РЕДАКТИРОВАТЬ Эта проблема была исправлена ​​с помощью BinaryWriter (байт []) для правильной записи изображений в виде текста. Спасибо всем за помощь!

Ответы [ 5 ]

17 голосов
/ 20 мая 2009

Ну, ASCII только семибитный, с одной стороны. Однако я не верю, что ваш код на самом деле использует ASCII. Он вроде неявно использует ISO-8859-1.

Никогда обрабатывать текст как двоичный или наоборот. Это всегда приведет к проблемам.

Лучший способ преобразования двоичного текста в текст ASCII - использовать Base64:

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

Также обратите внимание, что если ваш код сработал , он все равно был бы крайне неэффективным - прочитайте StringBuilders и затем подумайте, что ваш код полуэквивалентен

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

Однако base64 - это определенно способ конвертировать текстовые и двоичные данные без потерь. Вам, конечно, нужно будет преобразовать его обратно в двоичный файл, чтобы снова просмотреть TIFF.

Обратите внимание, что вы не показали, как сохраняете или загружаете данные - у вас тоже могут быть проблемы. На самом деле, я подозреваю, что если бы вы смогли точно сохранить строку, вам , возможно, повезло, и вы сохранили данные, в зависимости от того, что именно вы делаете с этим ... но все равно используйте base64 .

0 голосов
/ 20 мая 2009

Вы, вероятно, читаете базу данных как Unicode, что изменит некоторые двоичные значения в изображении.

Вы можете использовать методы класса System.IO.File для чтения / сохранения как двоичного, так и текстового. Они могут помочь вместе с опциями Base64, упомянутыми выше.

0 голосов
/ 20 мая 2009

Если вы записываете в файл только данные изображения, вам вообще не следует записывать его как текст, а как двоичные данные.

Если вы смешиваете текстовые и двоичные данные в файле, вам не следует преобразовывать двоичные данные в текстовые. Он может работать с некоторыми конкретными кодировками для преобразования его туда и обратно, но он определенно не работает с любой кодировкой для преобразования его в символы Юникода (используя Convert.ToChar).

Сделай это наоборот. Кодируйте текст в двоичные данные, используя метод GetBytes соответствующего объекта Encoding, чтобы у вас были только двоичные данные для записи в файл.

0 голосов
/ 20 мая 2009

Есть ли конкретная причина, по которой вы используете текст вместо двоичного файла?

Хранение двоичных данных в текстовых файлах - это всегда плохая идея, поскольку кодировки могут преобразовывать байты в другое представление, а специальные символы, такие как перевод строки, также могут обрабатываться и преобразовываться специально.

Либо сохраняйте данные в виде байтового массива в двоичном файле, либо используйте правильное преобразование двоичного кода в ascii, например предложение Джона в Base64, или, возможно, также возможен список шестнадцатеричных значений, разделенных запятыми.

0 голосов
/ 20 мая 2009

Один из способов получения двоичных данных и их преобразования в текстовые данные заключается в использовании StreamReader и предоставлении требуемой кодировки. Как и Джон, упомянутый выше, неразумно использовать ASCII, но в случае, если кто-либо захочет передать двоичный файл в какую-либо другую текстовую кодировку, вот код для этого.

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...