static void Main(string[] args) { var imagen360 = new Bitmap360(@"C:\Users\Euler\Pictures\SAM_100_0033.jpg"); var imagenWm = new WatermarkBitmap(@"C:\Users\Euler\Pictures\ESIME.png"); Watermarking wm = new Watermarking(imagen360, imagenWm, new Factores(), //TissotIndicatrix.TopIndicatrix, //TissotIndicatrix.BottomIndicatrix, TissotIndicatrix.FirstIndicatrix, TissotIndicatrix.SecondIndicatrix, TissotIndicatrix.ThirdIndicatrix, TissotIndicatrix.FourthIndicatrix //TissotIndicatrix.FifthIndicatrix, //TissotIndicatrix.SixthIndicatrix, //TissotIndicatrix.SeventhIndicatrix, //TissotIndicatrix.EighthIndicatrix, //TissotIndicatrix.NinthIndicatrix, //TissotIndicatrix.TenthIndicatrix, //TissotIndicatrix.EleventhIndicatrix, //TissotIndicatrix.TwelfthIndicatrix ); wm.Prepare(); wm.Apply().Save(@"C:\Users\Euler\Pictures\ImagenMarcada10.jpg", ImageFormat.Jpeg); Console.ReadKey(); }
/// <summary> /// Se inicializa el marcado de agua. /// </summary> /// <param name="image360">Imagen 360°</param> /// <param name="watermark">Marca de agua</param> /// <param name="algorithm">Algoritmo de inserción</param> /// <param name="indicatrix">Posiciones donde se realizará el marcado</param> public Watermarking(Bitmap360 image360, WatermarkBitmap watermark, IWatermarkAlgorithm algorithm, params TissotIndicatrix[] indicatrix) { if (indicatrix.Length > 0) { this._image360 = image360; //image360.Clone() as Bitmap360; this._imageWatermark = watermark; //watermark.Clone() as WatermarkBitmap; this._indicatrixes = indicatrix.ToList(); this._waterMark = new WatermarkBitmap(new Bitmap(image360.Width, image360.Height, watermark.PixelFormat)); // Se inicializan los fisheye this._topFisheye = new FisheyeBitmap(image360); this._bottomFisheye = new FisheyeBitmap(image360); // Se asigna el algoritmo this._algorithm = algorithm; } }
/// <summary> /// Algoritmo para la inserción de la marca de agua, se emplea un factor de 0.5 por defecto. /// </summary> internal unsafe Bitmap360 InsertWatermarkUnmanaged(Bitmap360 image360, WatermarkBitmap watermark, double factor = 0.5) { var factorA = (1 - factor); var factorB = factor; try { image360.LockBits(); watermark.LockBits(); Parallel.For(0, image360.Height, fila => { for (int columna = 0; columna < image360.Width; columna++) { // Se obtienen los pixeles var pixel360 = image360[columna, fila]; var pixelWM = watermark[columna, fila]; // Solo se toma en cuenta a los pixeles que NO son transparentes if (pixelWM.A == 255) { // Se asigna el pixel resultante image360[columna, fila] = Color.FromArgb( (int)(pixel360.R * factorA + pixelWM.R * factorB), (int)(pixel360.G * factorA + pixelWM.G * factorB), (int)(pixel360.B * factorA + pixelWM.B * factorB)); } } }); } finally { image360.UnlockBits(); watermark.UnlockBits(); } return(image360); }
/// <summary> /// Se muestra la marca de agua en landscape /// </summary> /// <param name="path"></param> private async Task DisplayWaterMark(string path) { // Se obtiene la imagen 360 try { _Watermark = new WatermarkBitmap(path); WatermarkImage = null; RaisePropertyChanged(nameof(WatermarkImage)); await Task.Factory.StartNew(() => { WatermarkImage = new BitmapImage(); WatermarkImage.BeginInit(); WatermarkImage.StreamSource = new MemoryStream(File.ReadAllBytes(path)); WatermarkImage.EndInit(); WatermarkImage.Freeze(); RaisePropertyChanged(nameof(WatermarkImage)); }); var flyout = _metroWindow.Flyouts.Items[2] as Flyout; flyout.IsOpen = !flyout.IsOpen; } catch (Exception e) { await DialogManager.ShowMessageAsync(_metroWindow, "Vuelva a intentarlo", e.Message, settings : new MetroDialogSettings() { ColorScheme = MetroDialogColorScheme.Accented }); _Watermark = null; WatermarkImage = null; RaisePropertyChanged(nameof(WatermarkImage)); } }
/// <summary> /// Se realiza la inserción de la marca de agua en toda la imagen 360° a partir de una coordenada (X, Y) de la imagen 360°. /// Se emplea un factor de 0.5. /// </summary> /// <param name="image360">Imagen 360°</param> /// <param name="watermark">Marca de agua</param> /// <param name="x">Indice X</param> /// <param name="y">Indice Y</param> public Bitmap InsertWatermark(Bitmap360 image360, WatermarkBitmap watermark, int x, int y) { return(InsertWatermarkUnmanaged(image360, watermark, this.Factor)._image); }
/// <summary> /// Se realiza la inserción de la marca de agua en toda la imagen 360°. /// Se emplea un factor de 0.5. /// </summary> /// <param name="image360">Imagen 360°</param> /// <param name="watermark">Marca de agua</param> public Bitmap InsertWatermark(Bitmap360 image360, WatermarkBitmap watermark) { return(InsertWatermark(image360, watermark, 0, 0)); }