C# 模仿微信生成九宫图头像

效果图
test1test2test3test4test5test6test7test8test9


.NET Core 需要安装 ZKWeb.System.Drawing 包
ZKWeb.System.Drawing

引用

using System.DrawingCore;
using System.DrawingCore.Drawing2D;
using System.IO;
using System.Net;

九宫图

public class JiuGongDiagram {
    private const int _width = 132; //合成九宫图的宽度
    private const int _height = 132; //合成九宫图的高度

    /// <summary>
    /// 获取坐标
    /// </summary>
    /// <param name="number">数量</param>
    /// <returns></returns>
    private string[] GetXy(int number) {
        string[] s = new string[number];
        int _x = 0;
        int _y = 0;
        switch (number) {
            case 1:
                _x = _y = 6;
                s[0] = "6,6";
                break;
            case 2:
                _x = _y = 4;
                s[0] = "4," + (132 / 2 - 60 / 2);
                s[1] = 60 + 2 * _x + "," + (132 / 2 - 60 / 2);
                break;
            case 3:
                _x = _y = 4;
                s[0] = (132 / 2 - 60 / 2) + "," + _y;
                s[1] = _x + "," + (60 + 2 * _y);
                s[2] = (60 + 2 * _y) + "," + (60 + 2 * _y);
                break;
            case 4:
                _x = _y = 4;
                s[0] = _x + "," + _y;
                s[1] = (_x * 2 + 60) + "," + _y;
                s[2] = _x + "," + (60 + 2 * _y);
                s[3] = (60 + 2 * _y) + "," + (60 + 2 * _y);
                break;
            case 5:
                _x = _y = 3;
                s[0] = (132 - 40 * 2 - _x) / 2 + "," + (132 - 40 * 2 - _y) / 2;
                s[1] = ((132 - 40 * 2 - _x) / 2 + 40 + _x) + "," + (132 - 40 * 2 - _y) / 2;
                s[2] = _x + "," + ((132 - 40 * 2 - _x) / 2 + 40 + _y);
                s[3] = (_x * 2 + 40) + "," + ((132 - 40 * 2 - _x) / 2 + 40 + _y);
                s[4] = (_x * 3 + 40 * 2) + "," + ((132 - 40 * 2 - _x) / 2 + 40 + _y);
                break;
            case 6:
                _x = _y = 3;
                s[0] = _x + "," + ((132 - 40 * 2 - _x) / 2);
                s[1] = (_x * 2 + 40) + "," + ((132 - 40 * 2 - _x) / 2);
                s[2] = (_x * 3 + 40 * 2) + "," + ((132 - 40 * 2 - _x) / 2);
                s[3] = _x + "," + ((132 - 40 * 2 - _x) / 2 + 40 + _y);
                s[4] = (_x * 2 + 40) + "," + ((132 - 40 * 2 - _x) / 2 + 40 + _y);
                s[5] = (_x * 3 + 40 * 2) + "," + ((132 - 40 * 2 - _x) / 2 + 40 + _y);
                break;
            case 7:
                _x = _y = 3;
                s[0] = (132 - 40) / 2 + "," + _y;
                s[1] = _x + "," + (_y * 2 + 40);
                s[2] = (_x * 2 + 40) + "," + (_y * 2 + 40);
                s[3] = (_x * 3 + 40 * 2) + "," + (_y * 2 + 40);
                s[4] = _x + "," + (_y * 3 + 40 * 2);
                s[5] = (_x * 2 + 40) + "," + (_y * 3 + 40 * 2);
                s[6] = (_x * 3 + 40 * 2) + "," + (_y * 3 + 40 * 2);
                break;
            case 8:
                _x = _y = 3;
                s[0] = (132 - 80 - _x) / 2 + "," + _y;
                s[1] = ((132 - 80 - _x) / 2 + _x + 40) + "," + _y;
                s[2] = _x + "," + (_y * 2 + 40);
                s[3] = (_x * 2 + 40) + "," + (_y * 2 + 40);
                s[4] = (_x * 3 + 40 * 2) + "," + (_y * 2 + 40);
                s[5] = _x + "," + (_y * 3 + 40 * 2);
                s[6] = (_x * 2 + 40) + "," + (_y * 3 + 40 * 2);
                s[7] = (_x * 3 + 40 * 2) + "," + (_y * 3 + 40 * 2);
                break;
            case 9:
                _x = _y = 3;
                s[0] = _x + "," + _y;
                s[1] = _x * 2 + 40 + "," + _y;
                s[2] = _x * 3 + 40 * 2 + "," + _y;
                s[3] = _x + "," + (_y * 2 + 40);
                s[4] = (_x * 2 + 40) + "," + (_y * 2 + 40);
                s[5] = (_x * 3 + 40 * 2) + "," + (_y * 2 + 40);
                s[6] = _x + "," + (_y * 3 + 40 * 2);
                s[7] = (_x * 2 + 40) + "," + (_y * 3 + 40 * 2);
                s[8] = (_x * 3 + 40 * 2) + "," + (_y * 3 + 40 * 2);
                break;
        }
        return s;
    }

    /// <summary>
    /// 获取尺寸
    /// </summary>
    /// <param name="number">数量</param>
    /// <returns></returns>
    private float GetSize(int number) {
        int w = 0;
        if (number == 1) {
            w = 120;
        }
        if (number > 1 && number <= 4) {
            w = 60;
        }
        if (number >= 5) {
            w = 40;
        }
        return w;
    }

    /// <summary>
    /// 图片压缩
    /// </summary>
    /// <param name="bitmap">Bitmap</param>
    /// <param name="width"></param>
    /// <param name="height"></param>
    /// <returns></returns>
    private Bitmap ImageCompression(Bitmap bitmap, int width, int height) {
        using(var bmp = new Bitmap(width, height)) {
            //从Bitmap创建一个Graphics对象,用来绘制高质量的缩小图。  
            using(var gr = Graphics.FromImage(bmp)) {
                //设置 System.Drawing.Graphics对象的SmoothingMode属性为HighQuality  
                gr.SmoothingMode = SmoothingMode.HighQuality;
                //下面这个也设成高质量  
                gr.CompositingQuality = CompositingQuality.HighQuality;
                //下面这个设成High  
                gr.InterpolationMode = InterpolationMode.High;
                //把原始图像绘制成上面所设置宽高的截取图  
                var rectDestination = new Rectangle(0, 0, width, height);
                //绘制
                gr.DrawImage(bitmap, 0, 0, rectDestination, GraphicsUnit.Pixel);
                //保存截取的图片  
                return bitmap;
            }
        }
    }

    /// <summary>
    /// 下载图片
    /// </summary>
    /// <param name="path">路径</param>
    /// <returns></returns>
    private Bitmap PathConvertBitmap(string path, bool isHttp) {
        if (!isHttp) {
            return new Bitmap(path);
        }
        using(WebClient client = new WebClient()) {
            using(Stream stream = client.OpenRead(path)) {
                return (Bitmap) Image.FromStream(stream);
            }
        }
    }

    /// <summary>
    /// 合成九宫图
    /// </summary>
    /// <param name="imgPath">图片路径(绝对路径)</param>
    /// <param name="isHttp">网络图片</param>
    /// <returns></returns>
    public Bitmap Synthetic(string[] imgPath, bool isHttp = false) {
        //合成数量
        int number = imgPath.Length;
        //坐标
        string[] xys = this.GetXy(number);
        //尺寸
        var size = this.GetSize(number);
        Bitmap backgroudBitmap = new Bitmap(_width, _height);
        using(Graphics g = Graphics.FromImage(backgroudBitmap)) {
            //设置 System.Drawing.Graphics对象的SmoothingMode属性为HighQuality  
            g.SmoothingMode = SmoothingMode.HighQuality;
            //下面这个也设成高质量  
            g.CompositingQuality = CompositingQuality.HighQuality;
            //下面这个设成High  
            g.InterpolationMode = InterpolationMode.High;
            //清除画布,背景设置为透明色
            g.Clear(Color.FromArgb(255, 255, 255));
            for (int i = 0; i < imgPath.Length; i++) {
                var bitmap = this.PathConvertBitmap(imgPath[i], isHttp);
                string[] xy = xys[i].Split(',');
                int x = int.Parse(xy[0]);
                int y = int.Parse(xy[1]);
                bitmap = this.ImageCompression(bitmap, x, y);
                g.DrawImage(bitmap, x, y, size, size);
                bitmap.Dispose();
            }
        }
        return backgroudBitmap;
    }
}

本地图片合成九宫图

//绝对路径
string[] path = new string[] {
    @"D:\test\7.jpg",
    @"D:\test\6.jpg", 
    @"D:\test\5.jpg"
};
JiuGongDiagram jiuGong = new JiuGongDiagram();
var bitmap = jiuGong.Synthetic(path);
//可以保存到本地或者上传到文件服务器
bitmap.Save(@"D:\test\test.jpg", System.DrawingCore.Imaging.ImageFormat.Png);
bitmap.Dispose();

下载网络图片合成九宫图

//网络路径
string[] path = new string[] {
    "http://www.qqzhi.com/uploadpic/2014-09-12/094036231.jpg",
    "http://www.qqzhi.com/uploadpic/2014-09-12/094036231.jpg", 
    "http://www.qqzhi.com/uploadpic/2014-09-12/094036231.jpg"
};
JiuGongDiagram jiuGong = new JiuGongDiagram();
var bitmap = jiuGong.Synthetic(path,true);
//可以保存到本地或者上传到文件服务器
bitmap.Save(@"D:\test\test.jpg", System.DrawingCore.Imaging.ImageFormat.Png);
bitmap.Dispose();
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值