using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace WindowsFormsApplication18 {
public class Form1 : Form {
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
// не исключено, что с ней будет даже медленнее.
// просто чтобы лишний цикл не вводить в DrawBitmapTiled
[DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)]
public static extern void CopyMemory(IntPtr dest, IntPtr src, int count);
private static readonly Bitmap BrushBitmap = CreateBrushBitmap();
public Form1() {
DoubleBuffered = true; // для красоты вывода
ResizeRedraw = true;
}
protected override void OnPaint(PaintEventArgs e) {
// создаём просто по размеру окна
var bmp = new Bitmap(ClientSize.Width, ClientSize.Height);
DrawBitmapTiled(BrushBitmap, bmp); // а вот и искомый битмап (!) profit
e.Graphics.DrawImageUnscaled(bmp, Point.Empty); // тоже, только для примера
base.OnPaint(e);
}
private static void DrawBitmapTiled(Bitmap src, Bitmap dest) {
var srcData = src.LockBits(new Rectangle(Point.Empty, src.Size), ImageLockMode.ReadOnly, src.PixelFormat);
var destData = dest.LockBits(new Rectangle(Point.Empty, dest.Size), ImageLockMode.WriteOnly, dest.PixelFormat);
var sp = srcData.Scan0;
var ss = srcData.Stride;
var dp = destData.Scan0;
var ds = destData.Stride;
var sw = srcData.Width;
var sh = srcData.Height;
var dw = destData.Width;
var dh = destData.Height;
for (int yd = 0; yd < dh; yd += sh)
for (int xd = 0; xd < dw; xd += sw)
for (int ys = 0; ys < sh && ys + yd < dh; ys++)
CopyMemory(dp + xd * 4 + (yd + ys) * ds, sp + ys * ss, Math.Min(sw, dw - xd) * 4);
src.UnlockBits(srcData);
dest.UnlockBits(destData);
}
private static Bitmap CreateBrushBitmap() {
// копипаста с сайта. т.к. делаем один раз на всю программу, производительность не важна
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);
}
return bitmap;
}
}
}