Пишу генератор превьюшек для графических файлов (в том числе для прозрачных 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);