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
(учитывая, что строки и столбцы индексируются нулем).
Если массив фактически содержит файл растрового изображения, то вы можете просто сохранить байты в виде файла:
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)
).
Я бы порекомендовал создание растрового изображения в C # и сохранение его.
Например, см. этот пост. (В частности, последний ответ правильный.)
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;
}