private void btnLoadFilter_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Title = "Select the Image Filter to load"; ofd.Filter = "Image Filter Files(*.xbmp)|*.xbmp"; if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { string xmlString = File.ReadAllText(ofd.FileName, Encoding.UTF8); BitmapFilterData tmpFilter = BitmapFilterData.XmlDeserialize(xmlString); if (tmpFilter == null) { MessageBox.Show("The selected file could not be processed!", "Filter File Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } filterData = tmpFilter; PopulateControls(); RenderOverlayBitmap(); } }
public static Bitmap BlendImage(this Bitmap baseImage, Bitmap overlayImage, BitmapFilterData filterData) { BitmapData baseImageData = baseImage.LockBits(new Rectangle(0, 0, baseImage.Width, baseImage.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb); byte[] baseImageBuffer = new byte[baseImageData.Stride * baseImageData.Height]; Marshal.Copy(baseImageData.Scan0, baseImageBuffer, 0, baseImageBuffer.Length); BitmapData overlayImageData = overlayImage.LockBits(new Rectangle(0, 0, overlayImage.Width, overlayImage.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); byte[] overlayImageBuffer = new byte[overlayImageData.Stride * overlayImageData.Height]; Marshal.Copy(overlayImageData.Scan0, overlayImageBuffer, 0, overlayImageBuffer.Length); float sourceBlue = 0; float sourceGreen = 0; float sourceRed = 0; float overlayBlue = 0; float overlayGreen = 0; float overlayRed = 0; for (int k = 0; k < baseImageBuffer.Length && k < overlayImageBuffer.Length; k += 4) { sourceBlue = (filterData.SourceBlueEnabled ? baseImageBuffer[k] * filterData.SourceBlueLevel : 0); sourceGreen = (filterData.SourceGreenEnabled ? baseImageBuffer[k + 1] * filterData.SourceGreenLevel : 0); sourceRed = (filterData.SourceRedEnabled ? baseImageBuffer[k + 2] * filterData.SourceRedLevel : 0); overlayBlue = (filterData.OverlayBlueEnabled ? overlayImageBuffer[k] * filterData.OverlayBlueLevel : 0); overlayGreen = (filterData.OverlayGreenEnabled ? overlayImageBuffer[k + 1] * filterData.OverlayGreenLevel : 0); overlayRed = (filterData.OverlayRedEnabled ? overlayImageBuffer[k + 2] * filterData.OverlayRedLevel : 0); baseImageBuffer[k] = CalculateColorComponentBlendValue(sourceBlue, overlayBlue, filterData.BlendTypeBlue); baseImageBuffer[k + 1] = CalculateColorComponentBlendValue(sourceGreen, overlayGreen, filterData.BlendTypeGreen); baseImageBuffer[k + 2] = CalculateColorComponentBlendValue(sourceRed, overlayRed, filterData.BlendTypeRed); } Bitmap bitmapResult = new Bitmap(baseImage.Width, baseImage.Height, PixelFormat.Format32bppArgb); BitmapData resultImageData = bitmapResult.LockBits(new Rectangle(0, 0, bitmapResult.Width, bitmapResult.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); Marshal.Copy(baseImageBuffer, 0, resultImageData.Scan0, baseImageBuffer.Length); bitmapResult.UnlockBits(resultImageData); baseImage.UnlockBits(baseImageData); overlayImage.UnlockBits(overlayImageData); return(bitmapResult); }
private void btnSaveFilter_Click(object sender, EventArgs e) { if (filterData == null) { return; } SaveFileDialog sfd = new SaveFileDialog(); sfd.Title = "Specify a file name and file path"; sfd.Filter = "Image Filter Files(*.xbmp)|*.xbmp"; sfd.AddExtension = true; if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { string xmlString = BitmapFilterData.XmlSerialize(filterData); File.WriteAllText(sfd.FileName, xmlString, Encoding.UTF8); } }
public static BitmapFilterData XmlDeserialize(string xmlString) { XmlSerializer xmlSerializer = new XmlSerializer(typeof(BitmapFilterData)); MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(xmlString)); XmlReader xmlReader = XmlReader.Create(memoryStream); BitmapFilterData filterData = null; if (xmlSerializer.CanDeserialize(xmlReader) == true) { xmlReader.Close(); memoryStream.Position = 0; filterData = (BitmapFilterData)xmlSerializer.Deserialize(memoryStream); } memoryStream.Close(); memoryStream.Dispose(); return(filterData); }
public static string XmlSerialize(BitmapFilterData filterData) { XmlSerializer xmlSerializer = new XmlSerializer(typeof(BitmapFilterData)); XmlWriterSettings xmlSettings = new XmlWriterSettings(); xmlSettings.Encoding = Encoding.UTF8; xmlSettings.Indent = true; MemoryStream memoryStream = new MemoryStream(); XmlWriter xmlWriter = XmlWriter.Create(memoryStream, xmlSettings); xmlSerializer.Serialize(xmlWriter, filterData); xmlWriter.Flush(); string xmlString = xmlSettings.Encoding.GetString(memoryStream.ToArray()); xmlWriter.Close(); memoryStream.Close(); memoryStream.Dispose(); return(xmlString); }