Как создать bmp файл из байта [] в C#

IFS=, полезна, только если вы используете read -a для чтения в массив, или вы передаете одно имя переменной на столбец, который хотите прочитать. Ниже мы делаем первое:

#!/usr/bin/env bash
#              ^^^^ -- NOT /bin/sh

row_idx=0
while IFS=, read -ra values; do
  for col_idx in "${!values[@]}"; do value=${values[$col_idx]}
    if [ "$value" = something ]; then
      echo "something found on row $row_idx, column $col_idx"
    fi
  done
  (( ++row_idx ))
done

См. Это работает на https://ideone.com/JN1pK3 , с выводом (после вставки something во вторую строку input, рядом с концом): something found on row 1, column 4 (учитывая, что строки и столбцы индексируются нулем).

8
задан Treb 12 April 2009 в 20:39
поделиться

3 ответа

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

File.WriteAllBytes(fileName, imageData);

Если массив содержит только необработанные данные пикселей, вы можете создать растровый объект, используя данные:

unsafe {
   fixed (byte* ptr = imageData) {
      using (Bitmap image = new Bitmap(width, height, stride, PixelFormat.Format24bppRgb, new IntPtr(ptr))) {
         image.Save(fileName);
      }
   }
}

Значение шага - это количество байтов между строками сканирования. Если между строками развертки нет отступов, для формата 24bpp это ширина ширина * 3 .

Этот метод использует данные в массиве, не создавая еще одну копию всего изображения в памяти (поэтому ему нужно значение шага).

Если растровые данные хранятся в массиве в перевернутом виде, значение шага должно быть отрицательным, а указатель должен быть началом последней строки сканирования в памяти ( ptr + stepde * (высота - 1) ).

12
ответ дан 5 December 2019 в 05:34
поделиться

Я бы порекомендовал создание растрового изображения в C # и сохранение его.

Например, см. этот пост. (В частности, последний ответ правильный.)

6
ответ дан 5 December 2019 в 05:34
поделиться

I can't test it using the stream you will be receiving, but this should work.

int WriteBitmapFile(string filename, int width, int height, byte[] imageData)
{
  using (var stream = new MemoryStream(imageData))
  using (var bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb))
  {
    BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0,
                                                    bmp.Width,
                                                    bmp.Height),
                                      ImageLockMode.WriteOnly,
                                      bmp.PixelFormat);

    Marshal.Copy(imageData, 0, bmpData.Scan0, imageData.Length);

    bmp.UnlockBits(bmpData);

    bmp.Save(filename);
  }

  return 1;
}
10
ответ дан 5 December 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: