Java base64图片编码上传,判断图片是否有旋转,修正并保存
最近遇到一个问题,手机端上传的图片为base64编码格式的,服务器需要通过解码字符串然后判断图片是否有旋转角度,在保存为图片。手上有一个.net的例子,但需要转为Java语言的,由于对Java的类认知不够,故不能完成.net程序转换为Java程序。各位大神,求指点。
以下是.net案例:
/// <summary> /// Base64解码字符串,并生成对应的文件保存 /// </summary> /// <param name="imgStr">Base64解码字符串</param> /// <param name="filePath">保存路径</param> /// <param name="fileName">保存文件名</param> /// <returns></returns> protected bool StringToImage(string imgStr, string filePath, string fileName) { if (imgStr == null) return false; try { byte[] bts = Convert.FromBase64String(imgStr); using (System.IO.FileStream fs = new System.IO.FileStream(filePath + fileName, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite, System.IO.FileShare.ReadWrite)) { foreach (var b in bts) { fs.WriteByte(b); } //判断图片旋转角度并进行校正 var bmp = new System.Drawing.Bitmap(fs); //此处引用了一个类库,用以获取照片的Exif信息 Exif.Exifextractor exif = new Exif.Exifextractor(ref bmp, "n"); var ori = exif["orientation"]; if (ori != null) { switch (ori.ToString()) { case "3"://要进行180度旋转 bts = BitmapToByte(KiRotate(bmp, 180, Color.Transparent)); break; case "6"://要进行90度旋转 bts = BitmapToByte(KiRotate(bmp, 90, Color.Transparent)); break; case "8"://要进行-90度旋转 bts = BitmapToByte(KiRotate(bmp, -90, Color.Transparent)); break; } fs.Seek(0, SeekOrigin.Begin); foreach (var b in bts) { fs.WriteByte(b); } } fs.Flush(); fs.Close(); } return true; } catch (Exception e) { return false; } }
/// <summary> /// 将bmp图片转换成byte /// </summary> /// <param name="bitmap"></param> /// <returns></returns> private byte[] BitmapToByte(Bitmap bitmap) { using (MemoryStream stream = new MemoryStream()) { bitmap.Save(stream, ImageFormat.Jpeg); byte[] data = new byte[stream.Length]; stream.Seek(0, SeekOrigin.Begin); stream.Read(data, 0, Convert.ToInt32(stream.Length)); return data; } }
/// <summary> /// 任意角度旋转 /// </summary> /// <param name="bmp">原始图Bitmap</param> /// <param name="angle">旋转角度</param> /// <param name="bkColor">背景色</param> /// <returns>输出Bitmap</returns> private Bitmap KiRotate(Bitmap bmp, float angle, Color bkColor) { int w = bmp.Width + 2; int h = bmp.Height + 2; PixelFormat pf; if (bkColor == Color.Transparent) { pf = PixelFormat.Format32bppArgb; } else { pf = bmp.PixelFormat; } Bitmap tmp = new Bitmap(w, h, pf); Graphics g = Graphics.FromImage(tmp); g.Clear(bkColor); g.DrawImageUnscaled(bmp, 1, 1); g.Dispose(); GraphicsPath path = new GraphicsPath(); path.AddRectangle(new RectangleF(0f, 0f, w, h)); Matrix mtrx = new Matrix(); mtrx.Rotate(angle); RectangleF rct = path.GetBounds(mtrx); Bitmap dst = new Bitmap((int)rct.Width, (int)rct.Height, pf); g = Graphics.FromImage(dst); g.Clear(bkColor); g.TranslateTransform(-rct.X, -rct.Y); g.RotateTransform(angle); g.InterpolationMode = InterpolationMode.HighQualityBilinear; g.DrawImageUnscaled(tmp, 0, 0); g.Dispose(); tmp.Dispose(); return dst; }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
终于搞定了,坑得不要不要的。详情:http://my.oschina.net/u/2344340/blog/699435
那app应用图片上传通常怎么做的?现在不是后端服务程序来决定前端使用的技术或实现方法,我没得选,已经被指定了要这么做。
回复
为啥不是直接传二进制流,非要转成BASE64, 也就一堆byte[]而已,甚至可以找个压缩算法压下再传
回复
HTTP自身就支持 gzip
回复
图片的话通常是不启用gzip的,因为多媒体文件通常自带无损压缩算法,本身冗余度就很低了,压制的意义不大
回复
学习了~
一直觉得用base64编码保存二进制文件实在不是最佳实践