大概过程
- 在http:axis.apache.org/axis2/java/core/download.html下载相应的lib和eclipse插件,添加包和插件就不再说了,添加完成eclipse会多出如下的wizard,放心大胆的干,C#的复杂类型,都有WCF处理好了,java调用时会有下面的工具替我们生成的。
- 选择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了,还能传图片哦