Using just gets converted into a try...catch...finaly block and in the finaly the variable gets disposed. And also you could eliminate the namespace and put more using
statements in the begining of the code. I think this is more readable:
string initialscontainerPath = "signatures/initailsdata.png";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(Microsoft.WindowsAzure.CloudConfigurationManager.GetSetting("StorageConnection"));
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference(Request.Url.Host.ToLower().Replace(".", "-"));
CloudBlockBlob blockBlob = container.GetBlockBlobReference(initialscontainerPath);
blockBlob.Properties.ContentType = "image/png";
byte[] initialsbytes = Convert.FromBase64String(initialsData);
byte[] signaturebytes = Convert.FromBase64String(signatureData);
CombineBitmaps(initialsbytes, signaturebytes);
Where CombineBitmaps is
private void CombineBitmaps(byte[] initialsbytes, byte[] signaturebytes, CloudBlockBlob blockBlob)
{
MemoryStream msinitials = null;
MemoryStream mssignature = null;
MemoryStream savestream = null;
MemoryStream uploadstream = null;
Bitmap bminitials = null;
Bitmap bmsignature = null;
Graphics g = null;
try
{
msinitials = new MemoryStream(initialsbytes);
mssignature = new MemoryStream(signaturebytes);
bminitials = new Bitmap(msinitials);
bmsignature = new Bitmap(mssignature);
savestream = new MemoryStream();
g = Graphics.FromImage(bmsignature);
g.DrawImage(bminitials, 0, 0);
bmsignature.Save(savestream, ImageFormat.Png);
uploadstream = new MemoryStream(savestream.ToArray());
blockBlob.UploadFromStream(uploadstream);
}
finally
{
DisposeNotNull(msinitials, mssignature, bminitials, bmsignature, g, savestream, uploadstream);
}
}
private void DisposeNotNull(params IDisposable[] objects)
{
foreach(IDisposable obj in objects)
if (obj != null) obj.Dispose();
}
And the variable names could use some pascal caseing (or what ever the name is).