Java base64图片编码上传,判断图片是否有旋转,修正并保存

发布于 2021-12-01 08:22:13 字数 4905 浏览 747 评论 7

最近遇到一个问题,手机端上传的图片为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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

天涯离梦残月幽梦 2021-12-04 20:05:59

终于搞定了,坑得不要不要的。详情:http://my.oschina.net/u/2344340/blog/699435

长安忆 2021-12-04 19:59:53

那app应用图片上传通常怎么做的?现在不是后端服务程序来决定前端使用的技术或实现方法,我没得选,已经被指定了要这么做。

爱你是孤单的心事 2021-12-04 19:46:44

回复
为啥不是直接传二进制流,非要转成BASE64, 也就一堆byte[]而已,甚至可以找个压缩算法压下再传

情栀口红 2021-12-04 17:44:29

回复
HTTP自身就支持 gzip

惜醉颜 2021-12-04 15:22:27

回复
图片的话通常是不启用gzip的,因为多媒体文件通常自带无损压缩算法,本身冗余度就很低了,压制的意义不大

残花月 2021-12-04 04:12:55

回复
学习了~

甜柠檬 2021-12-03 19:42:05

一直觉得用base64编码保存二进制文件实在不是最佳实践

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文