Як 32-бітне зображення перевести в 24-бітне програмою ZennoPoster

Інколи маючи справу з картинками є необхідність зменшити кількість кольорів які на ньому використовуються. Підходить для відправки 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-запит на потрібний сервіс).

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *