Вставить изображение в собственный файл - PullRequest
1 голос
/ 01 октября 2009

Я отредактировал этот вопрос, чтобы его было легче понять.

У меня есть файл изображения, и я должен сохранить данные изображения в существующем файле в двоичном формате. И когда этот файл снова открывается в моей программе, эти двоичные данные должны быть каким-то образом считаны, и это изображение должно отображаться в картинке. Как бы я сделал это в C #?

Любая помощь / предложения высоко ценится.

Спасибо Джейс

EDIT:

Поскольку наши файлы имеют следующую структуру:

Control
"Text here"
Location

... И будет много случаев, когда в одном файле будет более одного или нескольких элементов управления, например:

Label
"This is a label"
23, 44
Label
"This is another label"
23, 64
LinkLabel
"This is a linkLabel"
23, 84

...

Я не знаю, где разместить / сохранить следующий код:

Может быть, внутри файла вот так ...:

Image
"<controlLocationData type="Image">
  <Data>
    Base64 encoded image data here
  </Data>
  <FreeformLocation>60, 40</FreeforLocation>
</controlLocationData>"
60, 40

, а затем использовать этот код ниже для сохранения / загрузки и отображения изображения? ...

var image = LoadBitMap("My Bitmap");
var stream = new MemoryStream();
image.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
string base64Encoded = Convert.ToBase64String(stream.ToArray());

Ответы [ 3 ]

3 голосов
/ 01 октября 2009

Я, вероятно, был бы склонен просто создать блок текста base64 в вашем файле, который представляет биты BMP.

Edit:

Похоже, вы уже на правильном пути, я считаю, что с этими типами преобразований, пара методов расширения очень удобна ...

public static string ToBase64String(this Bitmap bm)
{
  MemoryStream s = new MemoryStream();
  bm.Save(s, System.Drawing.Imaging.ImageFormat.Bmp);
  s.Position = 0;
  Byte[] bytes = new Byte[s.Length];
  s.Read(bytes, 0, (int)s.Length);
  return Convert.ToBase64String(bytes);
}

public static Bitmap ToBitmap(this string s)
{
  Byte[] bytes = Convert.FromBase64String(s);
  MemoryStream stream = new MemoryStream(bytes);
  return new Bitmap(stream);
}

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

1 голос
/ 01 октября 2009

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

Посмотрите этот документ на MSDN для получения информации о доступе к метаданным в абстрактной манере.

Я не понимаю цели раздела «Контроль» - для чего он используется?

EDIT

Как сказал Тим, вероятно, неплохая идея кодировать изображение с помощью base64 и просто окружать эту информацию ... какой-то разметкой.

Если вы не ненавидите налог на угловые скобки, вы можете попробовать

<controlLocationData type="Image">
  <Data>
    Base64 encoded image data here
  </Data>
  <FreeformLocation>60, 40</FreeformLocation>
</controlLocationData>

Для кодирования и декодирования данных вам необходимо использовать метод Convert.ToBase64String , что-то вроде этого

var image = LoadBitMap("My Bitmap");
var stream = new MemoryStream();
image.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
string base64Encoded = Convert.ToBase64String(stream.ToArray());
0 голосов
/ 01 октября 2009

Документы Microsoft Word представляют собой структурированные файлы хранения (по сути, файловую систему в файле). MSDN начинает объяснять это здесь

...