Thursday, September 25, 2008

Change Image Attributes dynamically

This Snippet changes the Image details like : Author,Title,Summary,Comments etc ..when you draw image from System.Drawing namespace::

Also it causes a Force download and you can enetr your own file attributes in Author,Title,Summary,Comments etc ..


When you visit the any Page and save Image:
Below code will Save the User Name , the Ip Address ,time and the name of the image with force downlaod.
This string can be added in any Attribute :  Author,Title,Summary,Comments etc ..
Remember to FInd the User Yourself by MemberShip API

Clicking on any the Image button,or Datagrid,Gridview,Listview having Image Button:
pass the Query string to next page :

                          asp:ImageButton ID="imgButton" runat="server" 
                         ImageUrl='%# Eval("imageid", "Gallery/Thumbnail/{0}.jpg") %' OnClick="imgButton_Click" 
                            


 protected void imgButton_Click(object sender, ImageClickEventArgs e)
    {

        ImageButton img = (ImageButton)sender;
        HiddenField HF = (HiddenField)Page.Master.FindControl("HiddenField1");

        HF.Value = img.ImageUrl.ToString();

        Response.Redirect("openImage.aspx?ID=" + HF.Value + "");

    }

//and on second page Page load event :

protected void Page_Load(object sender, EventArgs e)
    {

        string Img = Request.QueryString["ID"].ToString();
        System.Web.UI.WebControls.Image im = new System.Web.UI.WebControls.Image();

        string strUrl = Img.Split('/')[2].ToString();
        string newImgUrl = strUrl.Replace(strUrl, "Gallery/HiRes/" + strUrl);
        im.ImageUrl = newImgUrl;
        im.AlternateText = Img;


        MembershipUser Usr = Membership.GetUser();
            
        string strIpAddress = Request.UserHostAddress;

        string strImageName = im.ImageUrl;
        DateTime Time = DateTime.Now.ToLocalTime();
        string strDestFileName = Usr + " - "+ strIpAddress + " - " + Time + " - " + System.IO.Path.GetFileName(strImageName);
        WriteProperties(strDestFileName , strImageName);
        
        Form.Controls.Add(im);
        
    }

 private void WriteProperties(string text ,string ImageName)
    {
        
        System.Drawing.Image imImage = System.Drawing.Image.FromFile(Server.MapPath("~/") + ImageName);
        System.Drawing.Imaging.PropertyItem[] AllProperties = imImage.PropertyItems;
        System.Drawing.Imaging.PropertyItem NewProp = AllProperties[0];


        byte[] Value = System.Text.ASCIIEncoding.Unicode.GetBytes(text);
        NewProp.Id = 40092;  // Comments
        NewProp.Len = Value.Length;
        NewProp.Value = Value;
        NewProp.Type = 1;
        imImage.SetPropertyItem(NewProp);
        ShowImage(imImage);
                      
    }

 private void ShowImage(System.Drawing.Image bmp)
    {
         HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.ContentType = "image/jpeg";
        HttpContext.Current.Response.AppendHeader("Content-disposition", "attachment; filename=");
        bmp.Save(HttpContext.Current.Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);

        bmp.Dispose();
        HttpContext.Current.Response.End();
    }

Thanks,
Nitin Sharma