版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/50425184
图片上传在JavaWeb方面已经有成熟的组件,那么对应到Winform(C#编写的富客户端组件)客户端到Java服务端的图片展示和上传,其实也有一套为之可行的方案。
一、效果展示
二、方案介绍(展示和上传)
- 展示的时候Java端将图片的路径(http://127.0.0.1:8080/Project/apple.gif,这也就是说需要一台web服务器提供http访问,这恰好对应我的项目,但可能并不适合你,请注意)传递到C#,C#通过设定
private System.Windows.Forms.PictureBox
对象的“ImageLocation”来进行显示。 - 上传的时候Winform客户端将选择的图片进行base64编码,进而通过json字符串传递到Java端,然后Java再通过base64进行解码,完成之后通过ImageIO对象进行图片的保存。
三、图片上传
“上传”按钮点击事件:
private void btnUpload_Click(object sender, EventArgs e)
{
openFileDialog1.FileName = string.Empty;
openFileDialog1.Filter = "Image Files(JPEG,GIF,BMP,etc.)|" +
"*.jpg;*.jpeg;*.gif;*.bmp;*.png|" +
"All files(*.*)|*.*";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
string picPath = openFileDialog1.FileName;
txtFilePath.Text = picPath;
Image image = Image.FromFile(picPath);
dealImage = ImageHelper.ImageToBytes(image);
dealImageType = System.IO.Path.GetExtension(picPath);
picDeal.ImageLocation = picPath;
}
}
- 点击上传按钮时,对弹出的选择器进行图片选择类型设置。
- 通过文件路径转换为Image对象。
- 通过ImageToBytes方法对图片进行base64编码(稍候请看详细代码)。
- 同时获取图片的类型,jpg还是png,供Java端保存使用。
ImageToBytes方法:
public static string ImageToBytes(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[] buffer = new byte[ms.Length];
//Image.Save()会改变MemoryStream的Position,需要重新Seek到Begin
ms.Seek(0, SeekOrigin.Begin);
ms.Read(buffer, 0, buffer.Length);
return Convert.ToBase64String(buffer);
}
}
通过ToBase64String方法进行base64的编码。
这之后,将base64字节码和图片类型传递给Java服务端。
四、图片保存
public static UploadFile saveFile(String image, String type) {
logger.debug("图片内容:" + image);
logger.debug("---------------------------------------");
if (image == null || "".equals(image)) {
return null;
}
BASE64Decoder decoder = new BASE64Decoder();
try {
String fileName = DateUtil.getCurrentMillStr() + new Random().nextInt(100) + "." + type;
UploadFile file = new UploadFile(SAVE_DIRECTORY, fileName, type);
byte[] bytes1 = decoder.decodeBuffer(image);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes1);
BufferedImage bi1 = ImageIO.read(bais);
File w2 = file.getFile();
ImageIO.write(bi1, type, w2);
return file;
} catch (IOException e) {
throw new OrderException("图片上传出错!");
}
}
- 通过BASE64Decoder的decodeBuffer方法进行字节码的解码操作。
- 通过ImageIO对图片进行保存。
相关文章
本文出自:【沉默王二的博客】