将大型WPF画布切成许多小PNG图像 [英] Slice Large WPF Canvas Into Many Small PNG Images
本文介绍了将大型WPF画布切成许多小PNG图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
假设我有一个很大的(3000 X 4000)WPF画布.
Assume I have very large (3000 X 4000) WPF canvas.
我正在寻找将这种画布切成n×n个.png图像图块的最佳方法.
I'm looking for the best way to slice this canvas into a bunch of n by n .png image tiles.
有什么建议吗?
推荐答案
不确定最好还是最简单,但这是一种方法:)
Not sure about either best or easiest but here's a way :)
private void SaveFrameworkElement(FrameworkElement frameworkElement)
{
BitmapImage bitmapImage = VisualToBitmapImage(frameworkElement);
for (int startX = 0; startX <= 400; startX += 100)
{
for (int startY = 0; startY <= 100; startY += 100)
{
SaveImage(bitmapImage, startX, startY, 100, 100, "C:\\CutImage_" + startX.ToString() + "-" + startY.ToString() + ".png");
}
}
}
public BitmapImage VisualToBitmapImage(FrameworkElement frameworkElement)
{
RenderTargetBitmap rtb = new RenderTargetBitmap((int)frameworkElement.ActualWidth,
(int)frameworkElement.ActualHeight,
96d,
96d,
PixelFormats.Default);
rtb.Render(frameworkElement);
MemoryStream stream = new MemoryStream();
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(rtb));
encoder.Save(stream);
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = stream;
bitmapImage.EndInit();
return bitmapImage;
}
public void SaveImage(BitmapImage sourceImage,
int startX,
int startY,
int width,
int height,
string filePath)
{
TransformGroup transformGroup = new TransformGroup();
TranslateTransform translateTransform = new TranslateTransform();
translateTransform.X = -startX;
translateTransform.Y = -startY;
transformGroup.Children.Add(translateTransform);
DrawingVisual vis = new DrawingVisual();
DrawingContext cont = vis.RenderOpen();
cont.PushTransform(transformGroup);
cont.DrawImage(sourceImage, new Rect(new Size(sourceImage.PixelWidth, sourceImage.PixelHeight)));
cont.Close();
RenderTargetBitmap rtb = new RenderTargetBitmap(width, height, 96d, 96d, PixelFormats.Default);
rtb.Render(vis);
FileStream stream = new FileStream(filePath, FileMode.Create);
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(rtb));
encoder.Save(stream);
stream.Close();
}
这篇关于将大型WPF画布切成许多小PNG图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文