Інколи маючи справу з картинками є необхідність зменшити кількість кольорів які на ньому використовуються. Підходить для відправки captcha на сервіси розпізнавання, а також для збереження скриншотів, на яких не важлива повна деталізація.
Сам код який переносить пікселі з 32 бітного зображення в 24 бітне зображення може виглядати приблизно так:
– формуємо шлях до збереження зображення
– зчитуємо зображення в Bitmap
– створюємо нове зображення в якому буде результат з бажаним форматом пікселів, наприклад Format24bppRgb
– створюємо зону для переносу пікселів
– створюємо область в яка буде використана
– власне проводимо копіювання пікселів
– зберігаємо результат
// Шлях до 32 бітного зображення string path_input =@"C:\image.jpg"; // Шлях до 24-бітного зображення string path_output = Path.Combine(project.Directory, "24_"+Path.GetFileName(path_input)); // Зчитуємо зображення using (var img32 = new Bitmap(path_input)) { // Створюємо нове 24-бітне зображення using (var img24 = new Bitmap(img32.Width, img32.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb)) { // створюємо зону для переносу пікселів using (var g = Graphics.FromImage(img24)) { // Створюємо прямокутник за розміром вхідного зображення var r = new Rectangle(0, 0, img32.Width, img32.Height); // Копіюємо пікселі в нове зображення g.DrawImage(img32, r, r, GraphicsUnit.Pixel); } // Зберігаємо результат img24.Save(path_output, System.Drawing.Imaging.ImageFormat.Jpeg); } }
Інструкції using тут використовуються для того, щоб правильно звільнити ресурси оперативної пам’яті після виходу з цього блоку. Проте інколи зручніше використовувати Dispose(). Нижче цей самий код, тільки з використанням Dispose замість using:
string path_input =@"C:\image.jpg"; string path_output = Path.Combine(project.Directory, "24_"+Path.GetFileName(path_input)); var img32 = new Bitmap(path_input); var img24 = new Bitmap(img32.Width, img32.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); var r = new Rectangle(0, 0, img32.Width, img32.Height); var g = Graphics.FromImage(img24)); g.DrawImage(img32, r, r, GraphicsUnit.Pixel); img24.Save(path_output, System.Drawing.Imaging.ImageFormat.Jpeg); g.Dispose(); img24.Dispose(); img32.Dispose();
Звичайно, в даному випадку розглядається фрагмент коду, який бере дані з файла що знаходиться на диску, і зберігає результат у інший файл на диск. Проте, в інших публікаціях я розказував про те як перевести зображення в base64 і як з base64 одержати Bitmap. Тобто, при необхідності всі зміни зображення можна провести в оперативній пам’яті не використовуючи збереження в файл (скачали зображення, змінили, відправили HTTP-запит на потрібний сервіс).