3

私はWindows Phone(およびStackOverflow tbh)でのプログラミングが初めてです。現在、Windows Phone のストレージ (Exif 情報付き) に保存されている画像を Java サーバーに送信する作業に取り組んでいます。これまでのところ、Windows Phone クライアントからバイト ストリームを送信し、Java 側でイメージを構築することに成功しましたが、Exif 情報がなぜか失われています。問題を引き起こしているのは、Windows Phone での送信方法にあると思います。ヘルプやガイダンスに非常に感謝しています! Windows Phone クライアントでの私のコードは次のとおりです。

// 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 サーバーでは、

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 phone から送信されたものと同じですが、Exif 情報はまったくありません。情報が失われる原因となる私が間違っていたことを誰かが指摘できますか? Windows Phone コードで SaveJpeg 関数を呼び出し、画像ファイルを書き換え、そこにあるすべての情報を失ったためだと推測していますが、画像をバイトに変換してストリーミングする方法が他にわかりません。

多くの助けに感謝します!ありがとうございました。

4

1 に答える 1

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);
于 2012-10-16T23:21:44.793 に答える