Как мне улучшить свой Дитер до 16-битного цвета 565 и уменьшить количество цветов(16 цветов)
public BitmapImage BitMapSourceToBitmapImage(BitmapSource bitmapSource) { PngBitmapEncoder encoder = new PngBitmapEncoder(); MemoryStream memoryStream = new MemoryStream(); BitmapImage bImg = new BitmapImage(); encoder.Frames.Add(BitmapFrame.Create(bitmapSource)); encoder.Save(memoryStream); memoryStream.Position = 0; bImg.BeginInit(); bImg.StreamSource = memoryStream; bImg.EndInit(); return bImg; }
private System.Drawing.Bitmap BitmapImage2Bitmap(BitmapImage bitmapImage) { using (MemoryStream outStream = new MemoryStream()) { BmpBitmapEncoder enc = new BmpBitmapEncoder(); enc.Frames.Add(BitmapFrame.Create(bitmapImage)); enc.Save(outStream); System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(outStream); return new System.Drawing.Bitmap(bitmap); } }
public static Bitmap ConvertTo16bpp(Bitmap img) { var bmp = new Bitmap(img.Width, img.Height, System.Drawing.Imaging.PixelFormat.Format16bppRgb565); using (var gr = Graphics.FromImage(bmp)) gr.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height)); return bmp; }
private BitmapSource BitReduction(BitmapImage myBitmapImageFit) { FormatConvertedBitmap fcb = new FormatConvertedBitmap(); fcb.BeginInit(); fcb.Source = myBitmapImageFit as BitmapSource; fcb.DestinationFormat = System.Windows.Media.PixelFormats.Indexed4; fcb.DestinationPalette = BitmapPalettes.Halftone8; fcb.EndInit(); return (fcb as BitmapSource); }
private void ApplyFilter(string path) { BitmapImage myBitmapImage = new BitmapImage(); // BitmapSource objects like BitmapImage can only have their properties // changed within a BeginInit/EndInit block. myBitmapImage.BeginInit(); myBitmapImage.UriSource = new Uri(path); myBitmapImage.DecodePixelHeight = 240; myBitmapImage.DecodePixelWidth = 320; myBitmapImage.EndInit(); var imageProcessed = ConvertTo16bpp(BitmapImage2Bitmap(myBitmapImage)); var newbitmapimage = BitmapToBistmapImage(imageProcessed); BitmapSource bitmapSource = BitReduction(newbitmapimage); var bitmapToProcess = BitmapImage2Bitmap(BitMapSourceToBitmapImage(bitmapSource)); bitmapToProcess.Save(@"C:\image6.bmp");
byte[] byteArray = new byte[350000];
byteArray = File.ReadAllBytes(@"C:\image6.bmp");
List<string> result = new List<string> (System.Text.RegularExpressions.Regex.Split(hello2, @"(?<=\G.{2})", System.Text.RegularExpressions.RegexOptions.Singleline)); string newstring = string.Join(" ", result);
Что я уже пробовал:
Шаги:
-дизеринг в 16 бит цвет 565
-уменьшение цвета (4 бита на пиксель, 16 цветов)
-сохранить файл
-получить массив байтов из bmp-файла
-преобразование bytearray в шестнадцатеричную строку для тестирования
Так:
Я хотел бы знать, делают ли метод сглаживания и битредукция правильную работу или должны быть улучшены и как?