好,所以我遇到的问题是-我需要加载保存在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 );
我没有错误消息,只是在寻找替代方法以使图像更平滑/不嘈杂。