为什么当我尝试上传带有 Windows Phone 的图片时,它上传了一个随机的东西?

Why when I try to upload an Image with Windows Phone it uploads a random thing?

我正在尝试从我的 Windows 商店应用程序 (Windows Phone 8.1) 上传图像到主机(使用 PHP),但总是当我 "uploaded" 图像,我检查了它的结果 "image" 它是一个损坏的文件。我认为这与字节数组转换有关,但我还没有找到另一种方法。这是我的代码:

C#代码:

byte[] ConvertBitmapToByteArray()
{
    WriteableBitmap bmp = bitmap;

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

public async Task<string> Upload()
{
    try
    {
        using (var client = new HttpClient())
        {
            using (var content =
                new MultipartFormDataContent())
            {
                byte[] data = ConvertBitmapToByteArray();
                content.Add(new StreamContent(new MemoryStream(data)), "userfile", fileNewImage);

                using (
                   var message =
                       await client.PostAsync("http://xplace.com/uploadtest.php", content))
                {
                    var input = await message.Content.ReadAsStringAsync();

                    return input;
                }
            }
        }
    }
    catch (Exception ex)
    {
        return null;
    }
}

PHP代码:

<?php
    header('Content-Type: application/json');
    $uploaddir = getcwd();
    $uploadfile = $uploaddir . "/" . basename($_FILES['userfile']['name']);

    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
        echo '{"result": "sucessfull"}';
    } else {
       echo '{"result": "-1"}';
    }
?>

我希望有人能告诉我我的错误以及如何解决。预先感谢您的宝贵知识。

您需要通过 BitmapEncoder 将您的 byte[] data 转换为常见的图像格式(例如 BMP、PNG、JPEG),然后再上传。目前您只是发送原始 ARGB 像素数据,没有关于如何解释它的信息。

例如,要编码为 BMP:

...
byte[] data = bitmap.PixelBuffer.ToArray();

using (var stream = new InMemoryRandomAccessStream())
{
    // encoder *outputs* to stream
    var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.BmpEncoderId, stream);

    // encoder's input is the bitmap's pixel data
    encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, 
        (uint)bitmap.PixelWidth, (uint)bitmap.PixelHeight, 96, 96, data);

    await encoder.FlushAsync();

    content.Add(new StreamContent(stream.AsStream()), "userfile", fileNewImage);
    ...
}