Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

Как отрисовать изображение с 16 битами на пиксель?

#c_sharp #winforms


Есть массив содержащий значения яркости пикселя размером 2 байта каждый.
Как мне в С# нарисовать данное изображение, используя именно 2 байта, а не 1 (0-255)?

Метод создания Bitmap'a для picturesBox'a:

    private void drawImage() {
            Bitmap bm = new Bitmap(1536, 4000, PixelFormat.Format16bppGrayScale);
            ushort[,] tempPixels = usingFile.getPixels();
            for(int y = 0; y < tempPixels.GetUpperBound(0) + 1; y++) {
                for(int x = 0; x < tempPixels.GetUpperBound(1) + 1; x++) {
                    //Задать яркость пикселя
                    console.log("" + tempPixels[y, x]);
                }
            }
            pictureBox.Image = bm;
        }

    


Ответы

Ответ 1



Вся проблема лежит в плоскости того факта, что Bitmap инкапсулирует GDI+ bimap. GDI+ version 1.0 and 1.1 can read 16-bits-per-channel images, but such images are converted to an 8-bits-per-channel format for processing, displaying, and saving. взято отсюда Фактически, там внутри ты можешь задавать 16 битные значения. Но лишь внутри. Соответственно, если ты задаешь извне в Bitmap, то ты задаешь значение пикселей в 8 bit per channel format. Если использовать unsafe code, то ты можешь иметь доступ к значениям напрямую. То есть присвоить ushort вместо byte. Попробуй просмотреть вот этот код, он должен помочь теоретически: https://stackoverflow.com/questions/20778227/get-64bpp-image-color Детальнее точно не подскажу т.к. с этим не приходилось стыкатся на столько близко :) Ответ, правда, скорее про хранение изображения, выходит... Если задашь вот так вот вручную значения, то в таком случае оно все равно отрисует изображение в 8 бит на пиксель. Но автоматически, как и сказано в цитате выше.

Комментариев нет:

Отправить комментарий