图片裁剪 PhotoCropper

本文介绍了一个使用ASP.NET和JavaScript实现的图片裁剪器。该裁剪器允许用户选择图片的特定区域,并将这些坐标传回服务器端进行裁剪操作。服务器端采用C#编程,实现了从原始图片中提取选定区域并保存为新图片的功能。

曾祥展

曾祥展

曾祥展

 

<script src="js/prototype.js" type="text/javascript"></script>    
<script src="js/scriptaculous.js?load=builder,dragdrop" type="text/javascript"></script>
<script src="js/cropper.js" type="text/javascript"></script>
<script type="text/javascript">
function onEndCrop( coords, dimensions ) {
    $( '<%=x1.ClientID%>' ).value = coords.x1;
    $( '<%=y1.ClientID%>' ).value = coords.y1;
    $( '<%=x2.ClientID%>' ).value = coords.x2;
    $( '<%=y2.ClientID%>' ).value = coords.y2;
    $( '<%=width.ClientID%>' ).value = dimensions.width;
    $( '<%=height.ClientID%>' ).value = dimensions.height;
}
Event.observe( 
    window, 
    'load', 
    function() { 
        new Cropper.ImgWithPreview( 
            '<%=imgSample.ClientID%>',
            {
                minWidth: 67, 
                minHeight: 86,
                onEndCrop: onEndCrop,
                displayOnInit: true 
            }
        ) 
    }
);         
</script>

 

 

 

    <div>  
        <asp:Image id="imgSample" runat="server" />
        <div id="previewArea"></div>
        <asp:Button ID="btnCrop" runat="server" Text="Crop Image" OnClick="btnCrop_Click" />
        <asp:Button ID="btnReset" runat="server" Text="Restart Demo" Visible="false" OnClick="btnReset_Click" />
         <br />    
        <input type="text" name="x1" id="x1" runat="server" style="visibility:hidden;"/>
        <input type="text" name="y1" id="y1" runat="server" style="visibility:hidden;"/>
        <input type="text" name="x2" id="x2" runat="server" style="visibility:hidden;"/>
        <input type="text" name="y2" id="y2" runat="server" style="visibility:hidden;"/>
        <input type="text" name="width" id="width" runat="server" style="visibility:hidden;"/>
        <input type="text" name="height" id="height" runat="server" style="visibility:hidden;"/>   
    </div>

 

 

 

 

 

using System;
using System.Web;
using System.IO;
using System.Web.UI;
using System.Drawing;
using System.Drawing.Imaging;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;


public partial class PhotoCropper : System.Web.UI.Page
{
    //原图
    private const string ORIG_SAMPLE_PHOTO_URL ="photos/2.jpg";
    //裁剪图
    private const string CROPPED_SAMPLE_PHOTO_URL = "photos/2Cropped.jpg";
 
protected void Page_Load(object sender, System.EventArgs e)
{
        if (!Page.IsPostBack)
        {
            loadPhoto(ORIG_SAMPLE_PHOTO_URL);
        }
        else
        {
            loadPhoto(CROPPED_SAMPLE_PHOTO_URL);
            btnCrop.Visible = !btnCrop.Visible;
            btnReset.Visible = !btnReset.Visible;
        }
}

    protected void loadPhoto(string url) 
    {
        imgSample.ImageUrl = url;
    }

    protected void btnCrop_Click(object sender, EventArgs e)
    {
        int iWidth = Convert.ToInt16(width.Value);
        int iHeight =  Convert.ToInt16(height.Value);
        int iX =  Convert.ToInt16(x1.Value);
        int iY =  Convert.ToInt16(y1.Value);

        //用字节流读取
        byte[] rawData = File.ReadAllBytes(Context.Server.MapPath(""+ORIG_SAMPLE_PHOTO_URL+""));

        byte[] newImage = CropImageFile(rawData, iWidth, iHeight, iX, iY);
  
        writeByteArrayToFile(newImage);
    }

    //重置
    protected void btnReset_Click(object sender, EventArgs e)
    {
        Response.Redirect("PhotoCropper.aspx", true);
    }

    //字节数组换成图片文件
    protected void writeByteArrayToFile(byte[] byteImage) {
        using (BinaryWriter binWriter =
        new BinaryWriter(File.Open(Context.Server.MapPath("" + CROPPED_SAMPLE_PHOTO_URL + ""), FileMode.Create)))
        {
            binWriter.Write(byteImage);
        }
    }

    //裁剪
    protected byte[] CropImageFile(byte[] imageFile, int targetW, int targetH, int targetX, int targetY)
    {
        MemoryStream imgMemoryStream = new MemoryStream();
        System.Drawing.Image imgPhoto = System.Drawing.Image.FromStream(new MemoryStream(imageFile));

        Bitmap bmPhoto = new Bitmap(targetW, targetH, PixelFormat.Format24bppRgb);
        bmPhoto.SetResolution(72, 72);
   
        Graphics grPhoto = Graphics.FromImage(bmPhoto);
        grPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
        grPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
        grPhoto.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;

        try
        {
            grPhoto.DrawImage(imgPhoto, new Rectangle(0, 0, targetW, targetH), targetX, targetY, targetW, targetH, GraphicsUnit.Pixel);
            bmPhoto.Save(imgMemoryStream, System.Drawing.Imaging.ImageFormat.Jpeg);
        }
        catch (Exception e)
        {
            throw e;
        }
        finally
        {
            imgPhoto.Dispose();
            bmPhoto.Dispose();
            grPhoto.Dispose();
        }
        return imgMemoryStream.GetBuffer();
    }

    //转换图片成子节流
    protected byte[] ConvertImageToByteArray(System.Drawing.Image imageToConvert )  
    {
        byte[] imgByteArray;
        try
        {
            using (MemoryStream imgMemoryStream = new MemoryStream())
            {               
                imageToConvert.Save(imgMemoryStream, ImageFormat.Jpeg);
                imgByteArray = imgMemoryStream.ToArray();
            }
        }
        catch (Exception e)
        {
            throw e;
        }
        return imgByteArray;
    }
}
 
可以解决大图裁剪OOM异常的图片裁剪控件。这是因为它支持对图片进行压缩。你可以从相机拍照或相册中选择要裁剪图片。项目地址:https://github.com/ryanhoo/PhotoCropper 效果图:如何使用:创建参数实例CropParams来设置裁剪参数,如图片保存路径、是否裁剪、是否压缩等。mCropParams = new CropParams(this); mCropParams.refreshUri();//设置默认的保存路径,你也可以使用mCropParams.uri = ...自定义指定 mCropParams.enable = true;//是否开启裁剪 mCropParams.compress = false;//是否压缩图片如果你的图片比较大或图片裁剪裁剪后的图片仍然很大,你最好开启图片压缩mCropParams.compress = true,免得内存溢出。2. 进入图片选择、拍照或裁剪Intent intent = CropHelper.buildCameraIntent(mCropParams); startActivityForResult(intent, CropHelper.REQUEST_CAMERA);//拍照获取图片 //startActivityForResult(intent, CropHelper.REQUEST_CROP);//从图库中获取图片3. 重写activity的onActivityResult()方法,接收图片选择或裁剪的返回,并分发事件给CropHandler@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {         CropHelper.handleResult(this, requestCode, resultCode, data);//分发事件给CropHandler     }4. 让activity实现CropHandler接口,接收处理事件@Override     public CropParams getCropParams() {         return mCropParams;     }     @Override     public void onPhotoCropped(Uri uri) {//接收裁剪后的图片         // Original or Cropped uri      System.out.println("CropHandler:Crop Uri in path=" uri.getPath());         if (!mCropParams.compress)             mImageView.setImageBitmap(BitmapUtil.decodeUriAsBitmap(this, uri));     }     @Override     public void onCompressed(Uri uri) {//接收压缩后的图片      System.out.println("CropHandler:Compressed Uri in path=" uri.getPath());         // Compressed uri         mImageView.setImageBitmap(BitmapUtil.decodeUriAsBitmap(this, uri));     }     @Override     public void onCancel() {//取消裁剪图片选择         Toast.makeText(this, "Crop canceled!", Toast.LENGTH_LONG).show();     }     @Override     public void onFailed(String message) {//图片选择或裁剪失败         Toast.makeText(this, "Crop failed: "   message, Toast.LENGTH_LONG).show();     }     @Override     public void handleIntent(Intent intent, int requestCode) {//重新转到裁剪确认界面      System.out.println("CropHandler:handleIntent");         startActivityForResult(intent, requestCode);     }5 最后最好在onDestroy中清理下缓存@Override     protected void onDestroy() {         CropHelper.clearCacheDir();         super.onDestroy();     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值