技术 思绪 摘录 旅行
最近用.NET Core生成海报图,然后上传到阿里云OSS的时候,发现传上去之后,阿里云大小显示0,无法查看。真是GDI+一顿操作猛如虎。

image.png

image.png

一顿查阅资料,得到解决

先看看我最终的代码

          MessageInfo msg = new MessageInfo();
            string content = "https://www.yangshaofeng.com";//二维码生成所需的内容文字
   
            //开始生成二维码
            var encoder = new QrEncoder(ErrorCorrectionLevel.M);
            QrCode qrCode = encoder.Encode(content);
            GraphicsRenderer render = new GraphicsRenderer(new FixedModuleSize(14, QuietZoneModules.Two), Brushes.Black, Brushes.White);
            DrawingSize dSize = render.SizeCalculator.GetSize(qrCode.Matrix.Width);
            //将二维码信息画在GDI+位图上面
            Bitmap map = new Bitmap(dSize.CodeWidth, dSize.CodeWidth);
            Graphics g = Graphics.FromImage(map);
            render.Draw(g, qrCode.Matrix);
            //将GDI+位图转换为流数据
            MemoryStream ms = new MemoryStream();
            map.Save(ms, ImageFormat.Png);
            //获取背景图片
            var wwwroot_path = System.IO.Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "Uploads", "QrCode");
            var bg_path = System.IO.Path.Combine(wwwroot_path, "bg.png");
            Image qrcodebgimg = Image.FromFile(bg_path);
            //获取二维码的图片
            Image qrcodeimg = Image.FromStream(ms);
            //将背景转换为GID+位图  准备操作
            Bitmap qrcodebgmap = new Bitmap(qrcodebgimg);
            //位图转换为画板
            Graphics qrcodebgg = Graphics.FromImage(qrcodebgmap);
            //开始画二维码和头像
            //初始化一个位置
            qrcodebgg.DrawImage(qrcodeimg, 165, 770, 280, 280);

            //写字
            //画刷颜色
            SolidBrush txtBrush = new SolidBrush(Color.White);
            //格式居中
            StringFormat txtFromat = new StringFormat();
            txtFromat.Alignment = StringAlignment.Center;
            //开始画 文字  字体  画笔  位置中间
            qrcodebgg.DrawString("推荐码", new Font("黑体", 25), txtBrush, new Point(qrcodebgmap.Width / 2, 710), txtFromat);
            //可转换为流数据进行操作
            MemoryStream qrcodebgms = new MemoryStream();
            qrcodebgmap.Save(qrcodebgms, ImageFormat.Png);
            
            qrcodebgms.Seek(0, SeekOrigin.Begin); // 此处需要将流重置,不然下面的代码读取不到数据。
            
            string filename = $"123456789.png";
            msg = UploadImageOssByStream(qrcodebgms, filename);

关键就是这一句

qrcodebgms.Seek(0, SeekOrigin.Begin);

Seek 方法表示移动流的读取指针

第一个参数0 表示指针位置

第二个zhi参数 SeekOrigin.Begin 表示所提供的指针位置相对流的开始,一般还可以使用 SeekOrigin.Current 相对当前位置,SeekOrigin.End 相对流结束位置


CarsonIT 微信扫码关注公众号 策略、创意、技术

留下您的脚步

 

最近评论

查看更多>>

热点推荐

友情打赏

请打开您的微信,扫一扫