图片裁剪 PhotoCropper
<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; } }