Как осуществить заливку «шахматкой» для фона прозрачного рисунка на C#?

Пишу генератор превьюшек для графических файлов (в том числе для прозрачных gif и png). На выходе получается jpeg. Если исходный файл имел прозрачные области, то место них по умолчанию отображается черный цвет. Его можно залить другим цветом или рисунком или текстурой. Здесь все понятно:
public static Image Resize(this Image image,
	int maxWidth, int maxHeight, bool notIncrease = true)
{
	int w = image.Width;
	int h = image.Height;
	if (notIncrease && (w <= maxWidth && h <= maxHeight))
		return (Image)image.Clone();
	float ratioX = (float)maxWidth / (float)w;
	float ratioY = (float)maxHeight / (float)h;
	float ratio = Math.Min(ratioX, ratioY);
	int newWidth = (int)(w * ratio);
	int newHeight = (int)(h * ratio);
	Image res = new Bitmap(newWidth, newHeight,
		PixelFormat.Format24bppRgb);
	using (var g = Graphics.FromImage(res))
	{
		g.FillRectangle(Brushes.Gray, 0, 0, newWidth, newHeight);
		g.CompositingQuality =
			CompositingQuality.HighQuality;
		g.InterpolationMode =
			InterpolationMode.HighQualityBicubic;
		g.SmoothingMode =
			SmoothingMode.HighQuality;
		g.DrawImage(image, 0, 0,
			newWidth, newHeight);
	}
	return res;
}


Хочется сделать все красиво и прозрачный фон отображать не серым цветом, а в виде "шахматки", как, например, в фотошопе. Для этого, как я понимаю, можно подставить TextureBrush, который будет содержать требуемый орнамент.

Вопрос в том, как создать этот TextureBrush, чтобы эта операция занимала минимум машинного времени. Идеально - получать кисть из константного массива байтов. Как такое можно сделать?

Пример кода "в лоб" генерации кисти для шахматной заливки:
var bitmap = new Bitmap(20, 20);
using (var gg = Graphics.FromImage(bitmap))
{
	gg.FillRectangle(Brushes.Gray, 0, 0, 10, 10);
	gg.FillRectangle(Brushes.LightGray, 10, 0, 10, 10);
	gg.FillRectangle(Brushes.LightGray, 0, 10, 10, 10);
	gg.FillRectangle(Brushes.Gray, 10, 10, 10, 10);
}
var brush = new TextureBrush(bitmap);


Нужно что-то типа такого:
var bitmap = new Bitmap(20, 20) = {
	0x99,0x99,0x99,	0xcc,0xcc,0xcc,
	0x99,0x99,0x99,	0xcc,0xcc,0xcc,
	0x99,0x99,0x99,	0xcc,0xcc,0xcc,

	0xcc,0xcc,0xcc,	0x99,0x99,0x99,
	0xcc,0xcc,0xcc,	0x99,0x99,0x99,
	0xcc,0xcc,0xcc,	0x99,0x99,0x99,
};			
var brush = new TextureBrush(bitmap);
  • Вопрос задан
  • 3147 просмотров
Пригласить эксперта
Ответы на вопрос 2
т.к. речь идёт о производительности, то я бы сразу предпочёл заливку вручную, без использования кистей. так сказать, "во избежание недоразумений". то есть, 2 LockBits и ручная построчная копия (не надо BLITтить или DrawImage) в цикле. ну да, а картинка для заливки вон там у Вас выше создаётся=) вполне себе статичненькая)
Ответ написан
Комментировать
Zarinov
@Zarinov Автор вопроса
Про LockBits догадывался, но не знаю как сделать...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы