Нужна помощь / понимание того, как отображать TIF изображения в градациях серого в winforms в C # - PullRequest
0 голосов
/ 19 мая 2019

Хорошо, поэтому проблема, с которой я сталкиваюсь, заключается в том, что мне нужно загрузить изображение tif, сохраненное в Photoshop. TIF - одноканальное 8-битное изображение в градациях серого.

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

Я могу загрузить TIF-файлы RGB (3 канала) без проблем, это одноканальные изображения, которые сложны, так как мне нужно преобразовать их в RGB Bitmap для отображения.

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

Вот код, который загружает изображение TIF с диска:

        Bitmap Img = null;
        try {
            using( FileStream fs = new FileStream( ImgPath, FileMode.Open ) ){
                Image myImage = Image.FromStream( fs );
                Guid myGuid = myImage.FrameDimensionsList[0];
                FrameDimension myDimension = new FrameDimension( myGuid );
                using( MemoryStream ms = new MemoryStream() ){
                    myImage.SelectActiveFrame( myDimension, 0 );
                    myImage.Save( ms, ImageFormat.Tiff );
                    Img = new Bitmap( ms );
                }
            }
        }
        catch {
            return Img;
        }

Это функция, которая затем преобразует загруженное растровое изображение в байтовый массив:

    public static byte[] BitmapToByteArray( Bitmap bmp ) {
        // Lock the Bitmap in memory, and get the BitmapData
        BitmapData bmpData = bmp.LockBits( new Rectangle( 0, 0, bmp.Width, bmp.Height ), ImageLockMode.ReadOnly, bmp.PixelFormat );

        // Create Byte Array
        byte[] bmpBytes = new byte[ bmpData.Stride * bmp.Height ];

        // Copy bmpData Bytes into Byte Array
        Marshal.Copy( bmpData.Scan0, bmpBytes, 0, bmpBytes.Length );

        // Unlock the Bitmap in memory
        bmp.UnlockBits( bmpData );

        // Return the result
        return bmpBytes;
    }

Оттуда по запросу мне нужно преобразовать массив байтов в отображаемое растровое изображение в графическом окне. Это то, что я сейчас использую с индексированным изображением, которое выглядит шумно, и я хочу избежать.

Примечание. Этот код является частью большой функции, в которой я передаю ширину, высоту и количество каналов в виде целых чисел:

            NewBmp = new Bitmap( Width, Height, PixelFormat.Format8bppIndexed );

            // If Grayscale image, create custom color palette
            if( Channels == 1 ) {
                // Create a color palette
                ColorPalette ncp = NewBmp.Palette;

                // Fill in the entries
                for( int i=0; i<256; i++ ){
                    ncp.Entries[i] = Color.FromArgb( 255, i, i, i );
                }

                // Apply the color palette
                NewBmp.Palette = ncp;
            }

            // Copy byte array data into bitmap
            BitmapData bmpData = NewBmp.LockBits( new Rectangle( 0, 0, Width, Height ), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed );
            Marshal.Copy( PixelData, 0, bmpData.Scan0, PixelData.Length );
            NewBmp.UnlockBits( bmpData );

С моей стороны нет сообщений об ошибках, я просто ищу альтернативы, чтобы изображение было более плавным / не шумным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...