/// <summary>
/// 切割一张指定的图片
/// </summary>
/// <param name="source">指定的图片源</param>
/// <param name="tileWidth">图块宽度</param>
/// <param name="tileHeight">图块高度</param>
/// <returns>切割好的图片数组(从左往右,从上往下)</returns>
public static ImageSource[] SplitImage(BitmapSource source, int tileWidth, int tileHeight)
{
var colCount = source.PixelWidth / tileWidth;
var rowCount = source.PixelHeight / tileHeight;
var results = new ImageSource[rowCount * colCount];
var stride = tileWidth * ((source.Format.BitsPerPixel + 7) / 8);
var pixelsCount = tileWidth * tileHeight;
var tileRect = new Int32Rect(0, 0, tileWidth, tileHeight);
/// 切割一张指定的图片
/// </summary>
/// <param name="source">指定的图片源</param>
/// <param name="tileWidth">图块宽度</param>
/// <param name="tileHeight">图块高度</param>
/// <returns>切割好的图片数组(从左往右,从上往下)</returns>
public static ImageSource[] SplitImage(BitmapSource source, int tileWidth, int tileHeight)
{
var colCount = source.PixelWidth / tileWidth;
var rowCount = source.PixelHeight / tileHeight;
var results = new ImageSource[rowCount * colCount];
var stride = tileWidth * ((source.Format.BitsPerPixel + 7) / 8);
var pixelsCount = tileWidth * tileHeight;
var tileRect = new Int32Rect(0, 0, tileWidth, tileHeight);
for (int row = 0; row < rowCount; row++)
{
for (int col = 0; col < colCount; col++)
{
var pixels = new int[pixelsCount];
var copyRect = new Int32Rect(col * tileWidth, row * tileHeight, tileWidth, tileHeight);
source.CopyPixels(copyRect, pixels, stride, 0);
var wb = new WriteableBitmap(
tileWidth,
tileHeight,
source.DpiX,
source.DpiY,
source.Format,
source.Palette);
wb.Lock();
wb.WritePixels(tileRect, pixels, stride, 0);
wb.Unlock();
results[row * colCount + col] = wb;
}
}
{
for (int col = 0; col < colCount; col++)
{
var pixels = new int[pixelsCount];
var copyRect = new Int32Rect(col * tileWidth, row * tileHeight, tileWidth, tileHeight);
source.CopyPixels(copyRect, pixels, stride, 0);
var wb = new WriteableBitmap(
tileWidth,
tileHeight,
source.DpiX,
source.DpiY,
source.Format,
source.Palette);
wb.Lock();
wb.WritePixels(tileRect, pixels, stride, 0);
wb.Unlock();
results[row * colCount + col] = wb;
}
}
return results;
}
}
用法:
SplitImage(new BitmapImage(new Uri("E:/Graphics/Characters/a.png")), 70, 101)