2014-07-10 3 views
0

저는 Windows 8 응용 프로그램 개발을 처음 접했습니다. 로컬 스토리지에 비트 맵 이미지로 그리드를 저장해야하는 응용 프로그램을 개발 중입니다. 쓰기 가능한 비트 맵을 사용하여 시도했지만 솔루션을 얻지 못했습니다.격자를 비트 맵으로 저장하는 방법 Windows의 로컬 저장소에있는 이미지 8

그런 다음 샘플을 검색했지만 '불가능'이라고 대답했습니다. 그러나 일부 답변에서 나는 그것을 찾을 수있는 'WriteableBitmapEx'을 사용하여 발견했습니다. 하지만이 라이브러리를 사용하여이를 구현하는 방법을 모르겠습니다. 어느 누구라도 그 사실을 알고 있으면 저에게 답장하십시오.

미리 감사드립니다.

EDITED.

<Canvas Background="Cyan" Name="panelcanvas" Margin="47.5,57,327.5,153" 
    Width="200" 
    Height="400"> 
     <Image Name="maskimg" 
       Height="100" Width="220"/> 
     <ScrollViewer ZoomMode="Enabled" Name="scroll"> 
      <Image Name="img" Stretch="Fill" Canvas.Top="15" 
       Height="400" Width="200" Source="mask_image.png"> 
       <Image.RenderTransform> 
        <CompositeTransform x:Name="Composite_Transform"></CompositeTransform> 
       </Image.RenderTransform> 
      </Image> 
     </ScrollViewer> 

    </Canvas> 

    <Image Name="maskimg2" HorizontalAlignment="left" Width="200" 
    Height="400"/> 
    <Image Name="maskimg3" HorizontalAlignment="Right" Width="200" 
    Height="400"/> 

C# 코드.

var destBmp = BitmapFactory.New((int)panelcanvas.ActualWidth, (int)panelcanvas.ActualHeight);   
    foreach (var child in panelcanvas.Children) 
     {     
      var img = child as Image; 
      if (img != null) 
      { 
        var sourceMask = ((BitmapImage)img.Source); 
        var sourceUriMask = sourceMask.UriSource; 
        Uri imageUri = new Uri(strMask.ToString());      
        var srcBmp = await new WriteableBitmap(1, 1).FromContent(imageUri); 
        if (srcBmp != null) 
        { 
         var x = Canvas.GetLeft(img);        
         var y = Canvas.GetTop(img);       
         destBmp.Blit(new Rect(x, y, srcBmp.PixelWidth, srcBmp.PixelHeight),        srcBmp, new Rect(0, 0, srcBmp.PixelWidth, srcBmp.PixelHeight)); 
        } 
      } 
      await WriteableBitmapToStorageFile(destBmp, FileFormat.Jpeg); 

    private async Task<StorageFile> WriteableBitmapToStorageFile(WriteableBitmap WB, FileFormat fileFormat) 
    { 
     string FileName = "MyFile.jpeg"; 
     StorageFolder localFolder = ApplicationData.Current.LocalFolder; 
     var file = await localFolder.CreateFileAsync(FileName, CreationCollisionOption.ReplaceExisting); 

     using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite)) 
     { 
      BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoderGuid, stream); 
      Stream pixelStream = WB.PixelBuffer.AsStream(); 
      byte[] pixels = new byte[pixelStream.Length]; 
      await pixelStream.ReadAsync(pixels, 0, pixels.Length); 

      encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, 
           200, 
           200, 
           0, 
           0, 
           pixels); 
      await encoder.FlushAsync(); 
     } 
     return file; 
    } 
+0

당신이 키/값 쌍을 저장하는'localStorage' 뜻은, 또는 일반적으로 로컬 컴퓨터에 저장을 의미합니까? 이것이 XAML/WinRT "Windows Store"응용 프로그램인지 또는 데스크탑 WPF 응용 프로그램인지 확인할 수 있습니까? – Dai

+0

storageFolder (Windows 전화의 격리 보관소와 같은). 이것은 XAMl/WinRt windows store 응용 프로그램입니다. 나는 Windows 태블릿이 응용 프로그램을 개발하고 있습니다. – user3274778

+1

WriteableBitmapEx 비트 맵 이미지에 많은 확장 메서드가있는 비트 맵 이미지를 만듭니다. 따라서이 라이브러리를 사용하여 writablebitmap을 만들고 그 메소드를 탐색하면 얻을 수 있습니다. – loop

답변

0

이 블로그는 WriteableBitmapEx lib를 사용하여 수행해야 할 사항을 지적합니다. 필요한 RenderTargetBitmap은 Windows 8.1에서 소개되었습니다. Windows 8.0의 경우 이는 전혀 불가능합니다.

http://kodierer.blogspot.de/2013/12/easy-render-writeablebitmapex-with.html http://kodierer.blogspot.de/2013/12/how-to-encode-and-save-writeablebitmap.html

여기에 코드입니다 : "로컬 스토리지"으로

// Render some UI to a RenderTargetBitmap 
var renderTargetBitmap = new RenderTargetBitmap(); 
await renderTargetBitmap.RenderAsync(MyGrid); 

// Get the pixel buffer and copy it into a WriteableBitmap 
var pixelBuffer = await renderTargetBitmap.GetPixelsAsync(); 
var width = renderTargetBitmap.PixelWidth; 
var height = renderTargetBitmap.PixelHeight; 
WriteableBitmap wbmp = await new WriteableBitmap(1, 1).FromPixelBuffer(pixelBuffer, width, height); 

SaveWriteableBitmapAsJpeg(wbmp, "mygrid.jpg"); 

private static async Task SaveWriteableBitmapAsJpeg(WriteableBitmap bmp, string fileName) 
{ 
    // Create file in Pictures library and write jpeg to it 
    var outputFile = await KnownFolders.PicturesLibrary.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting); 
    using (var writeStream = await outputFile.OpenAsync(FileAccessMode.ReadWrite)) 
    { 
     await EncodeWriteableBitmap(bmp, writeStream, BitmapEncoder.JpegEncoderId); 
    } 
    return outputFile; 
} 

private static async Task EncodeWriteableBitmap(WriteableBitmap bmp, IRandomAccessStream writeStream, Guid encoderId) 
{   
    // Copy buffer to pixels 
    byte[] pixels; 
    using (var stream = bmp.PixelBuffer.AsStream()) 
    { 
     pixels = new byte[(uint) stream.Length]; 
     await stream.ReadAsync(pixels, 0, pixels.Length); 
    } 

    // Encode pixels into stream 
    var encoder = await BitmapEncoder.CreateAsync(encoderId, writeStream); 
    encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied, 
     (uint) bmp.PixelWidth, (uint) bmp.PixelHeight, 
     96, 96, pixels); 
    await encoder.FlushAsync(); 
} 
+0

감사합니다. 르네. 하지만 내 응용 프로그램은 Windows 8과 호환되어야합니다. 기본적으로 Windows 8 태블릿을 대상으로합니다. 나는 [link] (https://writeablebitmapex.codeplex.com/discussions/437411)를 보면서 일종의 해결책을 얻었다. 이를 사용하여 캔버스를 로컬 스토리지에 이미지로 저장할 수 있습니다. 하지만 내 캔버스 자식 중 하나는 이미지가있는 스크롤 뷰어입니다. 여기서 저는 그 이미지로 캔버스를 저장할 수 없습니다. 내 코드를 편집 했으므로 확인하고 회신 해주십시오. 고맙습니다. – user3274778