zoukankan      html  css  js  c++  java
  • SNS社交类网站照片头像裁剪源码

    客户端js不能操作文件,所以只能先上传图片再在服务器端剪切。

    1、上传图片

    2、js剪切图片(其实只是选取要剪切的部分)

    3、服务器端剪切

         (1)在页面的cs文件中剪切。须放几个隐藏控件以便回传js选取的坐标。

    其中剪切图片源码:


    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Drawing;

    public class Cut
    {
        
    /// <summary>
        
    /// 裁剪图片
        
    /// </summary>
        
    /// <param name="sourceImg">原图片路径</param>
        
    /// <param name="desImg">裁剪图片路径</param>
        
    /// <param name="left">X</param>
        
    /// <param name="top">Y</param>
        
    /// <param name="width"></param>
        
    /// <param name="height"></param>
        public static void CutImage(string sourceImg, string desImg, int left, int top, int width, int height)
        {
            System.Drawing.Image img 
    = System.Drawing.Bitmap.FromFile(sourceImg);
            System.Drawing.Image imgToSave 
    = new System.Drawing.Bitmap(width, height);
            System.Drawing.Graphics g 
    = System.Drawing.Graphics.FromImage(imgToSave);
            RectangleF sourceRect 
    = new RectangleF(left, top, width, height);
            RectangleF destinationRect 
    = new RectangleF(00, width, height);

            g.DrawImage(img,
                        destinationRect,
                        sourceRect,
                        GraphicsUnit.Pixel
                        );
            g.Save();
            imgToSave.Save(desImg, System.Drawing.Imaging.ImageFormat.Jpeg);
            g.Dispose();
            imgToSave.Dispose();
            img.Dispose();
        }


    }

         (2)在ashx中剪切,可回传文件流。用参数传递坐标。



    using System;
    using System.Web;
    using System.Drawing;
    using System.IO;

    public class ImgCropper_WebHandler : IHttpHandler
    {
        
    public void ProcessRequest(HttpContext context)
        {
            
    string Pic = Convert.ToString(context.Request["p"]);
            
    int PointX = Convert.ToInt32(context.Request["x"]);
            
    int PointY = Convert.ToInt32(context.Request["y"]);
            
    int CutWidth = Convert.ToInt32(context.Request["w"]);
            
    int CutHeight = Convert.ToInt32(context.Request["h"]);
            
    int PicWidth = Convert.ToInt32(context.Request["pw"]);
            
    int PicHeight = Convert.ToInt32(context.Request["ph"]);

            context.Response.ContentType = "image/jpeg";
            ResetImg(context, System.Web.HttpContext.Current.Server.MapPath(Pic), PicWidth, PicHeight, PointX, PointY, CutWidth, CutHeight).WriteTo(context.Response.OutputStream);
        }

        public MemoryStream ResetImg(HttpContext context, string ImgFile, int PicWidth, int PicHeight, int PointX, int PointY, int CutWidth, int CutHeight)
        {
            Image imgPhoto 
    = Image.FromFile(ImgFile);
            Bitmap bmPhoto 
    = new Bitmap(CutWidth, CutHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

            Graphics gbmPhoto = Graphics.FromImage(bmPhoto);
            gbmPhoto.DrawImage(imgPhoto, 
    new Rectangle(00, CutWidth, CutHeight), PointX * imgPhoto.Width / PicWidth, PointY * imgPhoto.Height / PicHeight, CutWidth * imgPhoto.Width / PicWidth, CutHeight * imgPhoto.Height / PicHeight, GraphicsUnit.Pixel);

            //保存图片到服务器
            bmPhoto.Save(context.Server.MapPath("upload/"+ Guid.NewGuid() + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

            //生成文件流回传
            MemoryStream ms2 = new MemoryStream();
            bmPhoto.Save(ms2, System.Drawing.Imaging.ImageFormat.Jpeg);

            imgPhoto.Dispose();
            gbmPhoto.Dispose();
            bmPhoto.Dispose();

            return ms2;
        }


        public bool IsReusable
        {
            
    get
            {
                
    return false;
            }
        }
    }


  • 相关阅读:
    基于Springboot+Junit+Mockito做单元测试
    HeidiSQL工具导出导入MySQL数据
    各类开发生产环境缩写
    数据库连接工具HeidiSql介绍(支持MySQL,MariaDB,Microsoft SQL或PostgreSQL)
    中国战争片新的里程碑
    WINDOWS 同步(Interlocked,InterlockedExchangeAdd,Slim读/写锁,WaitForSingleObject,CreateWaitableTimer等等)
    自绘实现半透明水晶按钮(继承CButton,设置BS_OWNERDRAW风格,覆盖DrawItem函数绘制按钮,把父窗口的背景复制到按钮上,实现视觉上的透明,最后通过AlphaBlend实现半透明)
    编辑框等控件边框美化(继承CEdit,然后覆盖OnMouseLeave, OnSetFocus, OnPaint函数即可。原来的CEdit虽然代码不可见,但它也是有句柄的,照样随便画)
    Delphi 7验证XML合法性(利用DTD、XSD)
    C# 7.0
  • 原文地址:https://www.cnblogs.com/MaxIE/p/1837799.html
Copyright © 2011-2022 走看看