需要帮助/了解如何在C#

时间:2019-05-18 21:32:56

标签: c# tiff display grayscale

好,所以我遇到的问题是-我需要加载保存在Photoshop中的tif图像。 tif是单通道8位灰度图像。

我的工作流程有些棘手,因为我需要将图像作为字节数组加载,存储,然后将字节数组转换为位图以在图片框中显示。

我可以毫无问题地加载RGB(3通道)tif文件,它的单通道图像非常棘手,因为我需要将其转换为RGB位图以用于显示。

我已经创建了索引调色板并以这种方式成功加载了它,但是我想知道是否有其他/更好的方法,因为图像看起来比索引调色板有噪声。我希望加载它,以便颜色值像在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 );

我没有错误消息,只是在寻找替代方法以使图像更平滑/不嘈杂。

0 个答案:

没有答案