2010-12-15 6 views
3

매우 큰 (3000 X 4000) WPF 캔버스가 있다고 가정합니다.큰 WPF 캔버스를 여러 개의 작은 PNG 이미지로 분할

저는이 캔버스를 n 개 n 개의 .png 이미지 타일로 슬라이스하는 가장 좋은 방법을 찾고 있습니다.

제안 사항?

+0

입니까? 메모리 또는 CPU 제한 사항 – BenMaddox

+0

이것을 위해, 나는 "가장 쉬운"을 위해 최적화하고 싶습니다. :-) 나는 Expression Blend를 사용하여 게임 레벨을 만들고 싶습니다. 게임 레벨을 .png로 잘라서 게임 엔진에 빨려 들어갈 수 있습니다. –

답변

4

안 중 가장 또는 가장 쉬운 확실하지만 방법 : 가장 정의하려면 어떻게

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(); 
} 
+0

감사합니다. 끝나면 답을 표시 해줍니다. –

+0

@ Jeff Weber : 방법이 효과가 있었습니까? –

+0

그것은 오랜 시간이 걸렸지 만, 마침내 이것으로 돌아 왔습니다. :-) 그리고, 네. 그것은 작동합니다. 감사. –

0

당신은 (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 속성을 사용하여 이미지에 프로그래밍 방식으로 연결된 (이미지가있는) 이미지를 지정합니다. 여기

+0

그건 내가 줄 대답에 상당히 가깝다. 요청은 png 이미지에 대한 것이 었음에 유의하십시오. – BenMaddox

+0

내 잘못입니다. Meleak은 JpegBitmapEncoder 대신 PngBitmapEncoder 클래스를 사용할 수 있다고 지적했습니다. – Guy

관련 문제