0

전체 화면을 덮는 그리드가 있으며이 그리드를 이미지로 만든 다음이 이미지를 서버에 보내려고합니다. 이 목적을 위해 RenderTargetBitmap을 사용하고 FileSave Picker를 사용하여 writeablebitmap을 성공적으로 저장합니다. 이미지 저장은 예상대로 정상 크기로 700kb이지만이 바이트는 너무 커서 서버에 업로드 할 수 없습니다. 700kb 이미지의 예상 바이트는 20 만 개가 될 수 있지만 제 상황에서는 30 만 개가 넘습니다. 확실히 바이트 문제가 있습니다. 다음은 파일 저장 선택기를 사용하여 이미지로 표를 저장하는 데 사용하는 코드입니다.UWP에서 서버에 업로드하기 위해 RednerTargetBitmap 이미지를 byteArray로 변환하는 방법

위의 코드는 정상적인 크기로 주어진 위치에 이미지를 저장합니다. 하지만 위의 픽셀 바이트 배열을 서버에 사용할 때. HTTP 요청 작업을 보내는 동안 예외를 취소하고 세부 사항을 확인했습니다. 엄청난 양의 Bytes 배열 때문입니다. 또한 50x50의 매우 작은 그리드를 보내면 30,000 바이트 만 있기 때문에 업로드가 성공적으로 완료되었지만 서버에 업로드 된 이미지는 비어 있거나 손상되었습니다. 또한 제가이 방법을 사용하여 바이트 배열을 변환 writeablebitmap 위에서 사용한

...

using (Stream stream = mywriteablebitmap.PixelBuffer.AsStream()) 
     using (MemoryStream memoryStream = new MemoryStream()) 
     { 
      stream.CopyTo(memoryStream); 
      return memoryStream.ToArray(); 
     } 

은 또한 반환 바이트 어레이와 같은 에러의 동일한 수의 서버에서 일어났다.

RenderTargetBitmap에서 바이트 배열을 만드는 정확한 방법을 알려주고 서버에 쉽게 업로드 할 수 있습니다.

+0

원시 픽셀 데이터와 인코딩 된 이미지 버퍼를 혼동하고 있습니다. [BitmapEncoder] (https://msdn.microsoft.com/en-us/library/windows/apps/windows.graphics.imaging.bitmapencoder.aspx)를 사용하여 비트 맵을 인코딩 한 다음 인코딩 된 버퍼를 전송하십시오. – Clemens

+0

clemens는 몇 가지 코드 도움말을 제공 할 수 있습니까 ?? 하나의 함수에서 나는 BitmapEncoder를 사용했지만이 줄에는 오류가있다. 'var 인코더 = BitmapEncoder.CreateAsync (BitmapEncoder.PngEncoderId, inMemoryRandomStream) 기다리고 있습니다.' – Shani74

답변

0

많은 검색을 한 후에 renderTargetBitmap을 isolatedstorage에 저장 한 다음 저장소에서 이미지 파일에 액세스하고이 방법을 사용하여 스트림 바이트 배열을 만듭니다.

var stream = await imageStorageFile.OpenStreamForReadAsync(); 
     imageBytes=ReadFully(stream); 

    public byte[] ReadFully(Stream input) 
    { 
     byte[] buffer = new byte[16 * 1024]; 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      int read; 
      while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       ms.Write(buffer, 0, read); 
      } 
      return ms.ToArray(); 
     } 
    } 

이제이 방법이 완벽하게 작동합니다.

0

그러나 위의 픽셀 바이트 배열을 서버에 사용할 때. HTTP 요청 작업을 보내는 동안 예외를 취소하고 세부 사항을 확인했습니다. 엄청난 양의 Bytes 배열 때문입니다.

나는 완전히 클레멘스와 함께, 당신이 그것을 업로드하기 전에 이미지를 인코딩해야 동의합니다.

private async Task<String> ToBase64(byte[] image, uint height, uint width, double dpiX = 96, double dpiY = 96) 
{ 
    var encoded = new InMemoryRandomAccessStream(); 
    var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, encoded); 
    encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, height, width, dpiX, dpiY, image); 
    await encoder.FlushAsync(); 
    encoded.Seek(0); 

    var bytes = new byte[encoded.Size]; 
    await encoded.AsStream().ReadAsync(bytes, 0, bytes.Length); 
    var base64String=Convert.ToBase64String(bytes); 
    return base64String; 
} 

그리고 당신의 코드에 전화 : 당신은 당신의 이미지를 인코딩하기 위해 다음과 같은 코드를 사용할 수 있습니다 당신은 Reading and Writing Base64 in the Windows Runtime을 참조 할 수 있습니다 WinRT에서 이미지를 인코딩에 대한 자세한 내용은

var pixelBuffer = await bitmap.GetPixelsAsync(); 
byte[] pixels = pixelBuffer.ToArray(); 
await ToBase64(pixels, (uint)bitmap.PixelHeight, (uint)bitmap.PixelWidth); 

.

+0

나는 이미지를 인코딩하려고하지만이 linevar 인코더에 오류가 발생했습니다. = BitmapEncoder.CreateAsync (BitmapEncoder.PngEncoderId, encoded)를 기다리고 있습니다. – Shani74

관련 문제