使用字节数组转换发送图像,从java到c#

时间:2014-12-04 02:41:05

标签: c# android asp.net bytearray memorystream

我正在尝试将我的Android设备上的.jpg文件发送到我的服务器计算机。

为此,我正在通过java android应用程序将图片转换为字节数组,并将其作为参数发送到我的服务器计算机。我是通过网络服务电话来做这件事的。

编辑第一个功能:

public static byte[] ImageConvertion(){

    File inputFile = new File("/storage/emulated/0/IFSpictures/icon-si_strapclamp.jpg");
    byte[] data;

    try{
        FileInputStream input = new FileInputStream(inputFile);
        ByteArrayOutputStream output = new ByteArrayOutputStream ();

        byte[] buffer = new byte[65535];

        int l;

        while ((l = input.read(buffer)) > 0)
            output.write (buffer, 0, l);

        input.close();
        output.close();

        data = output.toByteArray();
        return data;


    } catch (IOException e) {
        System.err.println(e);
        data=null;
    }
    return data;

}

我的Web服务是用ASP.NET(C#)语言编写的,并且有一个函数将字节数组作为参数并将其转换回服务器计算机上的图像。

[WebMethod]
public void ByteArrayToPicture(byte[] imageData)
{
    using (var ms = new MemoryStream(imageData))
    {
        Image image = Image.FromStream(ms);
        image.Save(@"C:\newImage.jpg");
    }
}

但是,由于网络服务方面,我无法做到这一点。我调试了它,似乎问题是由于Image.FromStream()函数。

我绝对没有传递参数的任何问题。我认为,语言冲突或转换图像与字节和反之亦然可能导致问题。有没有人有任何想法或看到错误?

我非常适合任何帮助。

感谢。

2 个答案:

答案 0 :(得分:4)

抱歉我的问题不完整,但是我想提供一些试图做同样事情的提示。

如果有人试图将图像发送到服务器并且双方都有不同的平台,那么不要将图像转换为字节数组!

原因是,在我的情况下,在Java上转换为字节数组的图像与C#上的字节数组不同。因此根据我的研究,不可能在服务器端收集图像。在Java上创建的字节数组在C#上没有正确的格式。

因此,任何人都希望数据从一种语言转移到另一种语言,使用Base64编码。将图像转换为一侧的Base64字符串,并将其作为字符串发送到另一种语言。由于Base64格式在每种语言上都是相同的,因此重现它不会有任何问题。

我用以下代码卖掉了这个问题:

Bitmap ourbitmap = BitmapFactory.decodeStream(imageStream, null, options);
ByteArrayOutputStream baos = new ByteArrayOutputStream();  
ourbitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);   
byte[] b = baos.toByteArray(); 
test = Base64.encodeToString(b, Base64.DEFAULT); 

这是我获取图像并将其转换为Java android应用程序上的Base64字符串的代码,

byte[] imageBytes = Convert.FromBase64String(Base64ImageData); 
MemoryStream ms = new MemoryStream(imageBytes, 0,
imageBytes.Length);

ms.Write(imageBytes, 0, imageBytes.Length);
Image image = Image.FromStream(ms, true);
image.Save(@"D:\tmpImage.jpg");

上面的代码采用Base64类型字符串并转换回图像。这是用C#编写的。

答案 1 :(得分:0)

有了这样一个不完整的代码示例和如此模糊的问题描述,很难确定问题是什么。

但是,回顾一下你发布的代码,我看到一个错误,如果这是你正在使用的代码那将是很重要的。在您的Java methodConvertion()方法中,您有以下声明:

data = output.toByteArray();

问题在于,所有这一切都是创建一个新的byte[]对象,并将对 local 变量的引用分配给data。该对象永远不会离开该方法。

大概你有一些其他的代码,在调用methodConvertion()之后,发送你传递给该方法的参数引用的byte[]对象。但是在调用方法之前,这个对象就是它。

您应该改为更改Java代码,使其如下所示:

public static byte[] methodConvertion(){
    File inputFile = new File("/storage/emulated/0/IFSpictures/icon-si_strapclamp.jpg");

    try{
        FileInputStream input = new FileInputStream(inputFile);
        ByteArrayOutputStream output = new ByteArrayOutputStream ();

        byte [] buffer = new byte [65536];
        int l;

        while ((l = input.read(buffer)) > 0)
            output.write (buffer, 0, l);

        input.close();
        output.close();

        return output.toByteArray();

    } catch (IOException e) {
        System.err.println(e);
        return null;
    }
}

然后在调用者中,您应该检查返回值,并且仅在值不是null时继续,否则以某种方式报告错误。

如果这不能解决您的问题,您应该编辑问题,使其具有a better code example,以便您更加具体地了解错误。运行代码时会发生什么,这与您的预期有何不同?请务必清楚地说明任何错误消息,准确引用它们,并包括异常的任何堆栈跟踪。