Я новичок в программировании на 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, переписал файл изображения и потерял всю информацию там, но я не знаю, как еще преобразовать изображение в байт и передать его.
Большая помощь приветствуется! Спасибо.
Что вы пробовали? –
Это может помочь упростить ваш код в меньшем и более простом тестовом примере, демонстрирующем вашу проблему. –
@RichardPena Итак, я создал WriteableBitMap, конвертировал его в MemoryStream, а затем в байтовый массив. Сервер Jave предположительно принимает байтовый массив и записывает его в файл. Изображение есть, но я потерял информацию Exif. Это моя проблема. – Yoshi3003