.NET實現圖片大小調整和多圖合併拼接

.NET實現多圖合併拼接

產品要在郵件中添加一張廣告圖片,圖片由一張動態二維碼和一張背景圖片組成。一開始時想了兩個方法:
  1. 用html和css的方式來實現
  2. 採用.net後臺重新繪製圖片的方式

對方法二自己並不是很瞭解,所以起初用html和css的方式進行了很多次嘗試,最終結果是無法實現。原因是郵箱對margin,top等css的支持較差或不支持。
最後只能採用.net後臺拼圖的方式來實現,起初以爲會很煩所以一開始並不想用這種方式。但是做下來發現還是挺簡單的,因爲微軟提供了很方便的api。
1. 新建一個web項目,添加一個名爲“Imgs”的文件夾來存放合併後的圖片。
2. 前臺代碼:

    <p>
        <asp:Button ID="Button1" runat="server" Text="合併圖片" onclick="Button1_Click" />
    </p>
    <div>
        <asp:Image ID="Image1" runat="server" />
    </div>
  1. 後臺代碼:
protected void Button1_Click(object sender, EventArgs e)
{
    string bgPath = DownloadImg("https://www.baidu.com/img/bd_logo1.png","bg.png");
    string qrPath = DownloadImg("https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/static/protocol/https/home/img/qrcode/zbios_efde696.png","qr.png");
    ////調整圖像大小
    Bitmap b = new Bitmap(bgPath);
    System.Drawing.Image i = resizeImage(b, new Size(270, 129));
    string rePath = Server.MapPath("Imgs") + "\\rebg.png";
    i.Save(rePath);
    i.Dispose();
    MergeImage(rePath, qrPath);
    Image1.ImageUrl = "Imgs/new.jpg";
}
//下載圖片
private string DownloadImg(string strPath,string strName) {
    WebClient my = new WebClient();
    byte[] mybyte;
    mybyte = my.DownloadData(strPath); 
    MemoryStream ms = new MemoryStream(mybyte);
    System.Drawing.Image img;
    img = System.Drawing.Image.FromStream(ms);
    string filePath = Server.MapPath("Imgs") + "\\" +strName;
    img.Save(filePath, ImageFormat.Png);   //保存
    return filePath;
}
//拼圖函數
private void MergeImage(string strBg, string strQr)
{ 
    // 數組元素個數(即要拼圖的圖片個數)
    int lenth = 2;
    // 圖片集合
    Bitmap[] maps = new Bitmap[lenth];
    //圖片對應縱座標集合
    int[] pointY = new int[lenth];
    //讀取本地圖片初始化Bitmap
    Bitmap map = null;

    //第一個圖片對象,背景圖片
    map = new Bitmap(strBg);
    maps[0] = map;
    pointY[0] = 0;
    //第二個圖片對象,二維碼
    map = new Bitmap(strQr);
    maps[1] = map;
    pointY[1] = 53;
    // 初始化背景圖片的寬高
    Bitmap bitMap = new Bitmap(270, 129);
    // 初始化畫板
    Graphics g1 = Graphics.FromImage(bitMap);
    ////設置畫布背景顏色爲白色
    //g1.FillRectangle(Brushes.White, new Rectangle(80, 45, 160, 125));
    //繪製第一個圖片,背景圖
    for (int i = 0; i < maps[0].Width; i++)
    {
        for (int j = 0; j < maps[0].Height; j++)
        {
            // 以像素點形式繪製(將要拼圖的圖片上的每個座標點繪製到拼圖對象的指定位置,直至所有點都繪製完成)
            var temp = maps[0].GetPixel(i, j);
            // 將圖片畫布的點繪製到整體畫布的指定位置
            bitMap.SetPixel(i, pointY[0] + j, temp);
        }
    }
    maps[0].Dispose();
    //繪製第二個圖片,一個白色邊框
    g1.FillRectangle(Brushes.LightGreen, new Rectangle(100, 48, 70, 70));
    //繪製第三個圖片,二維碼
    for (int i = 0; i < maps[1].Width; i++)
    {
        for (int j = 0; j < maps[1].Height; j++)
        {
            var temp = maps[1].GetPixel(i, j);
            bitMap.SetPixel(105 + i, pointY[1] + j, temp);
        }
    }
    maps[1].Dispose();
    // 保存輸出到本地
    bitMap.Save(Server.MapPath("Imgs") + "/new.jpg");
    g1.Dispose();
    bitMap.Dispose();
}
//調整圖像大小
private static System.Drawing.Image resizeImage(System.Drawing.Image imgToResize, Size size)
{
    //獲取圖片寬度
    int sourceWidth = imgToResize.Width;
    //獲取圖片高度
    int sourceHeight = imgToResize.Height;

    float nPercent = 0;
    float nPercentW = 0;
    float nPercentH = 0;
    //計算寬度的縮放比例
    nPercentW = ((float)size.Width / (float)sourceWidth);
    //計算高度的縮放比例
    nPercentH = ((float)size.Height / (float)sourceHeight);

    if (nPercentH < nPercentW)
        nPercent = nPercentH;
    else
        nPercent = nPercentW;
    //期望的寬度
    int destWidth = (int)(sourceWidth * nPercent);
    //期望的高度
    int destHeight = (int)(sourceHeight * nPercent);

    Bitmap b = new Bitmap(destWidth, destHeight);
    Graphics g = Graphics.FromImage((System.Drawing.Image)b);
    g.InterpolationMode = InterpolationMode.HighQualityBicubic;
    //繪製圖像
    g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
    g.Dispose();
    imgToResize.Dispose();
    return (System.Drawing.Image)b;
}

後臺代碼的主要邏輯:
這裏採用了直接從網絡上下載圖片到本地,然後對圖片進行和並的方式。
效果截圖:
結果截圖

http://blog.5lzy.com/Blog/Index/ViewEntity?code=WZ000019
http://blog.csdn.net/hesi9555/article/details/70255065

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章