프로그래밍/WPF, Silverlight
[Silverlight] 레이아웃을 캡쳐하기
당근천국
2011. 12. 4. 03:49
그냥은 안되고 외부 라이브러리를 사용해야 합니다.
FluxJpeg라는 라이브러리인데 비트맵을 JPG로 변환할때 사용합니다.
클래스로 사용하는 전체 코드이니 귀찬으면 그냥 복사해서 써도 됩니다.
using System.Windows.Media.Imaging; using System.IO; public class claExportImg { Canvas m_layoutScreen = null; public claExportImg() { } public void OnCapture(Canvas layoutScreen) { //사용할 레이아웃 지정 this.m_layoutScreen = layoutScreen; WriteableBitmap wb = new WriteableBitmap(this.m_layoutScreen, null); //이미지 객체 Image imgTemp = new Image(); imgTemp.Width = Convert.ToInt32(this.m_layoutScreen.ActualWidth); imgTemp.Height = Convert.ToInt32(this.m_layoutScreen.ActualHeight); imgTemp.Source = wb; //최종 이미지 파일 이름 string strFileName = SaveImage(imgTemp) + ".JPG"; } private string SaveImage(Image imgObject) { string sReturn = ""; //세이브 파일 다얄로그 SaveFileDialog sfdFile = new SaveFileDialog(); //라이브러리가 제이팩뿐이 없으니 파일 다얄로그에 jpg만 표시한다. sfdFile.Filter = "JPEG File | *.jpg"; //사용자가 파일 지정했는지? if (sfdFile.ShowDialog() == true) { //파일 지정을 했다. //저장할 파일을 오픈하고 //여기서 using를 사용하지 않으면 실버라이트의 제한사항인 사용자가 직접 호출하지 않았다는 오류가 발생합니다. using (Stream stream = sfdFile.OpenFile()) { //데이터를 넣고 ImageWriteStream(imgObject, stream); //세이브 파일 다얄로그가 생성한 파일이름은 확장자같은 것들이 붙을수 있으니 다시 준다. sReturn = sfdFile.SafeFileName; //파일을 닫아줍니다. stream.Close(); } } return sReturn; } /// <summary> /// 이미지를 스트림으로 변경 /// </summary> /// <param name="img"></param> /// <param name="st"></param> private static void ImageWriteStream(Image img, Stream st) { System.Windows.Media.Imaging.WriteableBitmap bitmap = new System.Windows.Media.Imaging.WriteableBitmap(img, null); //FJ객체 초기화 FluxJpeg.Core.ColorModel cmModel = new FluxJpeg.Core.ColorModel(); cmModel.Opaque = true; cmModel.colorspace = FluxJpeg.Core.ColorSpace.RGB; //칼라 배열 byte[][,] byteColor = FluxJpeg.Core.Image.CreateRaster(bitmap.PixelWidth, bitmap.PixelHeight, 3); for (int y = 0; y < bitmap.PixelHeight; y++) { int nWidth = y * bitmap.PixelWidth; for (int x = 0; x < bitmap.PixelWidth; x++) { int color = bitmap.Pixels[nWidth + x]; //비트연산으로 알쥐비값을 받아온다. //Red byteColor[0][x, y] = (byte)((color >> 16) & 0xff); //Green byteColor[1][x, y] = (byte)((color >> 8) & 0xff); //Blue byteColor[2][x, y] = (byte)(color & 0xff); } } // 이미지 파일 인코딩 FluxJpeg.Core.Image saveimg = new FluxJpeg.Core.Image(cmModel, byteColor); new FluxJpeg.Core.Encoder.JpegEncoder(saveimg, 100, st).Encode(); } }
코드자체는 복잡해 보이지만 분석해보시면 그렇다하게 문제가 되는 코드는 없습니다.
비트연산자는 나중에 다루긴 할거지만 일단 검색해보시면 많이 나옵니다 ㅎㅎㅎ
밑에 예제에서 테스트 해보세요.
배경이 드래그되니 여러부분에서 해보세요.