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

开源中国拾荒者 发布于 2016/06/20 17:12
阅读 1K+
收藏 0

最近遇到一个问题,手机端上传的图片为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;
        }



加载中
0
Feng_Yu
Feng_Yu
一直觉得用base64编码保存二进制文件实在不是最佳实践
爱吃大肉包
爱吃大肉包
回复 @Feng_Yu : 学习了~
Feng_Yu
Feng_Yu
回复 @爱吃大肉包 : 图片的话通常是不启用gzip的,因为多媒体文件通常自带无损压缩算法,本身冗余度就很低了,压制的意义不大
爱吃大肉包
爱吃大肉包
回复 @爱吃大肉包 : HTTP自身就支持 gzip
爱吃大肉包
爱吃大肉包
回复 @快速开发师 : 为啥不是直接传二进制流,非要转成BASE64, 也就一堆byte[]而已,甚至可以找个压缩算法压下再传
开源中国拾荒者
开源中国拾荒者
那app应用图片上传通常怎么做的?现在不是后端服务程序来决定前端使用的技术或实现方法,我没得选,已经被指定了要这么做。
下一页
0
开源中国拾荒者
开源中国拾荒者
终于搞定了,坑得不要不要的。详情:http://my.oschina.net/u/2344340/blog/699435
返回顶部
顶部