abdel hayan Ответов: 1

Как мне улучшить свой Дитер до 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 в шестнадцатеричную строку для тестирования
Так:
Я хотел бы знать, делают ли метод сглаживания и битредукция правильную работу или должны быть улучшены и как?

1 Ответов

Рейтинг:
0

Patrice T

Цитата:
Как мне улучшить свой Дитер до 16-битного цвета 565 и уменьшить количество цветов(16 цветов)

В чем же проблема? не работает? плохой качественный результат? слишком медленно? ...
Я не использую библиотеки изображений на ежедневной основе.

Вы сбросили 8 блоков кода, и ни одного комментария, объясняющего, что есть что.

Вы объясняете, какой результат вы хотите, но какова отправная точка?
- Мое первоначальное изображение-это ... размер ... цветовая кодировка
- Я делаю эту операцию, чтобы ... размер... цветовая кодировка
- Я делаю эту операцию, чтобы ... размер... цветовая кодировка
- Я получаю результат как ... размер ... цветовая кодировка

bitmapToProcess.Save(@"C:\image6.bmp");

Хранение файла в корневом каталоге C: - это плохая идея, потому что windows активно действует против него.
Вместо этого используйте подкаталог/папку.

Обратите внимание, что я не видел никакой операции сглаживания в этом коде.

[Обновление]
Моя процедура будет такой:
- Чтение изображения в переменную/объект
- Расширьте цветовую схему до 24 бит
- Размер 240*320
- дизеринг до 16 цветов 4 бита палитра
- преобразование в 4-битную цветовую схему
- сохранить новое изображение


abdel hayan

Мое исходное изображение составляет 151 КБ (bmp-файл)
он имеет 128 цветов
(Я даю вам только пример, но изображение может быть любого размера и, возможно, больше цветов и то же самое для высоты и ширины)
Но результат должен быть таким, как:
1-ширина= 320 высота = 240;

2 - Изображение колеблется до 16 цветов 565
3 - уменьшите цвета (4 бита на пиксель, 16 цветов)
4 - сохранить новое изображение в виде bmp-файла
5 - преобразуйте его в байтовый массив

Я думал, что с помощью этого метода ConvertTo16bpp(Bitmap img) Я делаю второй шаг
а с методом Битредукции третий шаг

abdel hayan

Я буду принимать во внимание сохранение файла в подкаталоге.
Большое спасибо
Мерси боку