Не могу сконвертировать dataGridView в таблицу байтов

219
13 июня 2018, 01:10

Здравсвтуйте. Такая проблема, открываю xlsx файл, записываю данные с него(предположительно только цифры) в datagridview, а потом хочу с этого datagridview скопировать все данные в таблицу байтов и высветлить, как картинку в PictureBoх. Проблема наступает в месте, где идет обработка данных для битмапы(Parameter is not valid). Смотрел в дебагере, все чисто(скрин ниже)

Перед написание данного поста, перепробовал множество вариантов(все, которые нашел на stackoverflow и не только). Может у кого есть догадки, что не так с данными?

private void buttonShowImage_Click(object sender, EventArgs e)
{
        int size = (dataGridView1.RowCount) * (dataGridView1.ColumnCount-1);
        byte[] arrOfValues = new byte[size];
        PictureBox picBox = new PictureBox();

        int k = 0;
        for(int i = 0; i < dataGridView1.Rows.Count; i++)
        {
            for(int j = 0; j < dataGridView1.Columns.Count-1; j++)
             arrOfValues[k++] = Convert.ToByte(dataGridView1[i, j].Value);
        }
        ImageConverter ic = new ImageConverter();
        Image img = (Image)ic.ConvertFrom(arrOfValues); // ОШИБКА ЗДЕСЬ
        Bitmap bmp = new Bitmap(img);
        // System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms);
        picBox.SizeMode = PictureBoxSizeMode.Zoom;
        //ImageConverter converte = new ImageConverter();
        picBox.Image = bmp;

        picBox.Show();
    }
Answer 1

Не имею под рукой среды разработки, однако идея следующая: картнка является двумерным массивом пикселей: picture[n][m], а вы пытаетесь заполнить ее одномерным массивом байтов arrOfValues[n*m].

Предлогаю создать Bitmap указывая размер в конструкторе и в цикле заполнить его значениями из массива байтов. Следует учитывать так же порядок чтения строк, он должен быть таким же как и при записи картинки в ексель, если изображение было прежде записано туда а не создано сразу в екселе.

Что то вроде такого:

int width = 256; //например
int height = 512;
Bitmap image = new Bitmap(width, height);
for (int i = 0; i < width; ++i) {
    for(int j = 0; j < height; ++j) {
        int col = arrOfValues[i*height+j];
        image.setPixel(i, j, Color.FromARGB(col,col,col));
    }
}
READ ALSO
C#. Как исправить ошибку NullReferenceException? [дубликат]

C#. Как исправить ошибку NullReferenceException? [дубликат]

На данный вопрос уже ответили:

206
Нужна ли БД для Telegram бота? [закрыт]

Нужна ли БД для Telegram бота? [закрыт]

Нужно написать Telegram бота с личным кабинетом в котором будет баланс пользователя и специально сгенерированная строка для реферальной ссылкиМожно...

193
Большая нагрузка при работе с БД

Большая нагрузка при работе с БД

Написал класс для работы с БД от SQL, однако в ходе работы создаётся дочерний процесс от SQL, который нагружает процессор на 20%, и потребляет 170 мб оперативы...

195