Хорошо, поэтому проблема, с которой я сталкиваюсь, заключается в том, что мне нужно загрузить изображение 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 );
С моей стороны нет сообщений об ошибках, я просто ищу альтернативы, чтобы изображение было более плавным / не шумным.