java调用c#wcf心得,主要解决传递图片问题

大概过程

  • 在http:axis.apache.org/axis2/java/core/download.html下载相应的lib和eclipse插件,添加包和插件就不再说了,添加完成eclipse会多出如下的wizard,放心大胆的干,C#的复杂类型,都有WCF处理好了,java调用时会有下面的工具替我们生成的。
    eclidpe新增wizard
  • 选择code Generator按照提示一步一步最终会生成相应的java代码
try {
            org.tempuri.ServiceStub client=new org.tempuri.ServiceStub();

            org.tempuri.Verify1 request=new org.tempuri.Verify1();
            request.setImgQueryImage(ImageUtil.ImageToBase64("E:\\照片\\1.jpg"));
            request.setImgTargetImage(ImageUtil.ImageToBase64("E:\\照片\\3.jpg"));
            System.out.println(client.verify1(request).getVerify1Result());

        } catch (Exception e) {
             TODO Auto-generated catch block
            e.printStackTrace();
        }

-原来c#wcf里有Verify1 函数,他需要ImgQueryImage和TargetImage这两个参数

注意点

C#WCF与Java之间图像的传递

笔者采用把图像转化为Base64字符串的方法,当然也可以把图像转化为byte[]的方法,以下的代码是我从网上找到C#与图像之间的互转方法,别急着复制这是一个坑

public static string  ImageToBase64(Image img)
        {
            try
            {
                BinaryFormatter binFormatter = new BinaryFormatter();
                MemoryStream memStream = new MemoryStream();
                binFormatter.Serialize(memStream, img);
                byte[] bytes = memStream.GetBuffer();
                string base64 = Convert.ToBase64String(bytes);
                return base64;
            }
            catch
            {
                return string.Empty;
            }
        }


        public static  Image Base64ToImage(string base64)
        {
            try
            {

                byte[] bytes = Convert.FromBase64String(base64);
                MemoryStream memStream = new MemoryStream(bytes);
                BinaryFormatter binFormatter = new BinaryFormatter();
                Image img = (Image)binFormatter.Deserialize(memStream);
                return img;
            }
            catch
            {
                return null;
            }
        }
  • 以上代码在应用在C#与WCF服务传递图片一点问题都没有,但到Java上的就出现问题的,java图片转Base64的代码如下:
//这是Java代码
public static String ImageToBase64(String imgFile) {
        //将图片文件转化为字节数组字符串,并对其进行Base64编码处理

        InputStream in = null;
        byte[] data = null;
        //读取图片字节数组
        try 
        {
            in = new FileInputStream(imgFile);        
            data = new byte[in.available()];
            in.read(data);
            in.close();
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
        //对字节数组Base64编码
        BASE64Encoder encoder = new BASE64Encoder();
        String s=encoder.encode(data);
        return encoder.encode(data);//返回Base64编码过的字节数组字符串
    }
  • 上面的Java代码将图片转换为Base64是不能用一开始的C#代码中Base64ToImage进行反向转化的,我查看了以上的两个版本的ImageToBase64 它们所返回的内容也确实不同,原因是C#的ImageToBase64的结果是直接从Image对象中转化为而来,而Java的ImageToBase64是从文件流中转化而来,C#的代码把图片当图片看待,而Java的代码把图片当文件看待,说了半天兼容的C#代码如下:
//这是C#代码
 public static Image BytesToImage(byte[] buffer)
        {
            MemoryStream ms = new MemoryStream(buffer);
            Image image = System.Drawing.Image.FromStream(ms);
            return image;
        }

        public static Image Base64ToImage(string base64)
        {
            byte[] bytes = Convert.FromBase64String(base64);
            Image image = BytesToImage(bytes);
            return image;

        }

        public static string ImageToBase64(Image image)
        {
            ImageFormat format = image.RawFormat;
            using (MemoryStream ms = new MemoryStream())
            {
                if (format.Equals(ImageFormat.Jpeg))
                {
                    image.Save(ms, ImageFormat.Jpeg);
                }
                else if (format.Equals(ImageFormat.Png))
                {
                    image.Save(ms, ImageFormat.Png);
                }
                else if (format.Equals(ImageFormat.Bmp))
                {
                    image.Save(ms, ImageFormat.Bmp);
                }
                else if (format.Equals(ImageFormat.Gif))
                {
                    image.Save(ms, ImageFormat.Gif);
                }
                else if (format.Equals(ImageFormat.Icon))
                {
                    image.Save(ms, ImageFormat.Icon);
                }
                byte[] bytes = new byte[ms.Length];
                //Image.Save()会改变MemoryStream的Position,需要重新Seek到Begin
                ms.Seek(0, SeekOrigin.Begin);
                ms.Read(bytes, 0, bytes.Length);
                string base64 = Convert.ToBase64String(bytes);
                return base64;
            }

        }
    }
  • 以上的C#版本的代码与java版本的Base64就兼容了,至此就可以java调用C#编写WCF了,还能传图片哦
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值