2012-10-16 2 views
3

저는 Windows Phone (및 StackOverflow tbh) 프로그래밍을 처음 사용합니다. 현재 Windows Phone의 저장소 (Exif 정보 포함)에 저장된 이미지를 Java 서버로 보내는 작업과 관련하여 작업하고 있습니다. 지금까지 성공적으로 Windows Phone 클라이언트에서 바이트 스트림을 보내고 Java 측에서 이미지를 생성했지만 Exif 정보는 어떻게 든 손실됩니다. 문제를 일으키는 Windows Phone에서 보내는 방법이라고 생각합니다. 어떤 도움이나 조언을 해주셔서 감사합니다! 여기에 출력 이미지가 동일Exif 정보 (Windows Phone에서 Java 서버로)

public static void main(String[] args) { 
    ServerSocket serverSocket; 
    Socket client; 
    try { 
     serverSocket = new ServerSocket(PORT_NUMBER); 
     while (true) { 
      client = serverSocket.accept(); 

      // Extract exif info 
      InputStream inputStream = client.getInputStream(); 
      InputStream stream = new BufferedInputStream(inputStream); 

      // Create file from the inputStream 
      File file = new File("image.jpg"); 
      try { 
       OutputStream os = new FileOutputStream(file); 
       byte[] buffer = new byte[4096]; 
        for (int n; (n = stream.read(buffer)) != -1;) { 
         os.write(buffer, 0, n); 
        } 
       } 

SocketClient.cs

자바 서버에서
 public string Send(MemoryStream data) 
     { 
     byte[] msData = data.ToArray(); 

     if (_socket != null) 
     { 
      // Create SocketAsyncEventArgs context object 
      SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs(); 

      // Set properties on context object 
      socketEventArg.RemoteEndPoint = _socket.RemoteEndPoint; 
      socketEventArg.UserToken = null; 

      socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e) 
      { 
       _clientDone.Set(); 
      }); 

      // Add the data to be sent into the buffer 
      socketEventArg.SetBuffer(msData, 0, msData.Length); 

      // Sets the state of the event to nonsignaled, causing threads to block 
      _clientDone.Reset(); 

      // Make an asynchronous Send request over the socket 
      _socket.SendAsync(socketEventArg); 

     } 
     else 
     { 
      response = "Socket is not initialized"; 
     } 

     return response; 
    } 

의 코드가,이다

// Windows Phone Client code (MainPage.xaml.cs) 
// This function is called when an image is selected from 
// the task PhotoChooserTask ptask, which brings 
// a popup that allows the user to choose an image 
// from the phone's storage 
void ptask_Completed(object sender, PhotoResult e) 
{ 
     if (e.TaskResult == TaskResult.OK && e.ChosenPhoto != null) 
     { 
      //Take JPEG stream and decode into a WriteableBitmap object 
      App.CapturedImage = PictureDecoder.DecodeJpeg(e.ChosenPhoto); 

      // Attempt to send the image 
      WriteableBitmap pic = new WriteableBitmap(App.CapturedImage); 
      MemoryStream stream = new MemoryStream(); 

      pic.SaveJpeg(stream, App.CapturedImage.PixelHeight, App.CapturedImage.PixelWidth, 0, 100); 
      stream.Seek(0, SeekOrigin.Begin); 
      client.Send(stream); 

      // Close the socket connection explicitly 
      client.Close(); 
     } 
    } 

: 다음은 윈도우 폰 클라이언트에 내 코드입니다 어떤 Exif 정보도없이 Windows 전화에서 보낸 것. 누구든지 내가 잘못한 정보를 잃어버린 원인을 지적 할 수 있습니까? Windows 전화 코드에서 SaveJpeg 함수를 호출하고 이미지 파일을 다시 작성한 다음 모든 정보를 잃어 버렸기 때문에 추측하고 있습니다. 그러나 이미지를 바이트로 변환하고 스트림하는 방법을 알지 못합니다.

많은 도움을 주실 수 있습니다! 고맙습니다.

+0

당신은 무엇을하려고 했습니까? –

+1

문제를 나타내는 작고 간단한 테스트 사례로 코드를 단순화하는 것이 도움이 될 수 있습니다. –

+0

@RichardPena 그래서 WriteableBitMap을 만들어 MemoryStream으로 변환 한 다음 바이트 배열로 변환했습니다. Jave 서버는 바이트 배열을 수신하여 파일에 기록합니다. 이미지가 있지만 Exif 정보를 잃어 버렸습니다. 그게 내 문제 야 .. – Yoshi3003

답변

1

나는 내 자신의 문제에 대한 답을 찾았습니다. 이것에 문제가있는 당신을 위해. 단순히 사용

Byte[] imageData = new byte[e.ChosenPhoto.Length]; 
e.ChosenPhoto.Position = 0; 
e.ChosenPhoto.Read(imageData, 0, imageData.Length); 

그런 다음 내 송신 기능에 바이트 배열을 보내

socketEventArg.SetBuffer(imageData, 0, imageData.Length);