매우 큰 (3000 X 4000) WPF 캔버스가 있다고 가정합니다.큰 WPF 캔버스를 여러 개의 작은 PNG 이미지로 분할
저는이 캔버스를 n 개 n 개의 .png 이미지 타일로 슬라이스하는 가장 좋은 방법을 찾고 있습니다.
제안 사항?
매우 큰 (3000 X 4000) WPF 캔버스가 있다고 가정합니다.큰 WPF 캔버스를 여러 개의 작은 PNG 이미지로 분할
저는이 캔버스를 n 개 n 개의 .png 이미지 타일로 슬라이스하는 가장 좋은 방법을 찾고 있습니다.
제안 사항?
안 중 가장 또는 가장 쉬운 확실하지만 방법 : 가장 정의하려면 어떻게
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();
}
감사합니다. 끝나면 답을 표시 해줍니다. –
@ Jeff Weber : 방법이 효과가 있었습니까? –
그것은 오랜 시간이 걸렸지 만, 마침내 이것으로 돌아 왔습니다. :-) 그리고, 네. 그것은 작동합니다. 감사. –
당신은 (MSDN 사회에서 가져온 나의 코드) 같은 것을 수행 할 수 있습니다 오프 사각형으로, 당신은 그리드, 프로그래밍을 만드는 데 사용할 수있는 섹션 JPG로 그 코드에
public static RenderTargetBitmap GetJpgImage(UIElement targetUIElement, double scale, int quality)
{
double actualHeight = targetUIElement.RenderSize.Height;
double actualWidth = targetUIElement.RenderSize.Width;
double renderedHeight = actualHeight * scale;
double renderedWidth = actualWidth * scale;
RenderTargetBitmap renderTarget = new RenderTargetBitmap((int)renderedWidth, (int)renderedHeight, 96, 96, PixelFormats.Pbgra32);
VisualBrush sourceBrush = new VisualBrush(targetUIElement);
DrawingVisual drawingVisual = new DrawingVisual();
DrawingContext drawingContext = drawingVisual.RenderOpen();
using (drawingContext)
{
drawingContext.PushTransform(new ScaleTransform(scale, scale));
drawingContext.DrawRectangle(sourceBrush, null, new Rect(new System.Windows.Point(0, 0), new System.Windows.Point(actualWidth, actualHeight)));
}
renderTarget.Render(drawingVisual);
JpegBitmapEncoder jpgEncoder = new JpegBitmapEncoder();
jpgEncoder.QualityLevel = quality;
jpgEncoder.Frames.Add(BitmapFrame.Create(renderTarget));
MemoryStream memoryStream = new MemoryStream();
jpgEncoder.Save(memoryStream);
File.WriteAllBytes(@"D:\a.jpg", memoryStream.ToArray());
return renderTarget;
}
정교한를 grid.Column 및 Column.Column 속성을 사용하여 이미지에 프로그래밍 방식으로 연결된 (이미지가있는) 이미지를 지정합니다. 여기
입니까? 메모리 또는 CPU 제한 사항 – BenMaddox
이것을 위해, 나는 "가장 쉬운"을 위해 최적화하고 싶습니다. :-) 나는 Expression Blend를 사용하여 게임 레벨을 만들고 싶습니다. 게임 레벨을 .png로 잘라서 게임 엔진에 빨려 들어갈 수 있습니다. –