2012-10-16 3 views
3

Я новичок в программировании на Windows Phone (и StackOverflow tbh). В настоящее время я работаю над задачей, связанной с отправкой изображений, хранящихся в хранилище Windows Phone (с информацией Exif), на сервер Java. До сих пор я успешно отправлял поток байтов из клиента Windows Phone и конструировал изображение на стороне Java, однако информация Exif каким-то образом терялась. Я считаю, что это именно то, как я отправляю его на Windows Phone, что вызывает проблему. Очень ценю за любую помощь или руководство! Вот мой код на телефон клиента Windows:Отправка изображения с помощью информации Exif с Windows Phone на Java Server

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

Вот код в 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; 
    } 

На Java Server,

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); 
        } 
       } 

Результирующее изображение идентично тот, который был отправлен с телефона Windows, без всякой информации Exif. Кто-нибудь мог указать, что я сделал неправильно, что заставляет информацию потеряться? Я предполагаю, потому что я вызвал функцию SaveJpeg в коде телефона Windows, переписал файл изображения и потерял всю информацию там, но я не знаю, как еще преобразовать изображение в байт и передать его.

Большая помощь приветствуется! Спасибо.

+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);