コード例 #1
0
ファイル: Grayscale.cs プロジェクト: netcharm/PhotoTools
        /// <summary>
        ///
        /// </summary>
        /// <param name="image"></param>
        /// <param name="swap"></param>
        /// <returns></returns>
        internal Image Tawawa(Image image, bool dark = true, bool swap = false)
        {
            Bitmap src = AddinUtils.CloneImage(image) as Bitmap;

            if (image.PixelFormat != PixelFormat.Format32bppArgb)
            {
                src = Accord.Imaging.Image.Clone(image as Bitmap, PixelFormat.Format32bppArgb);
            }

            Accord.Imaging.UnmanagedImage dst = Accord.Imaging.UnmanagedImage.FromManagedImage(src);
            if (!dark && !swap)
            {
                #region Tawawa Blue
                for (int h = 0; h < dst.Height; h++)
                {
                    for (int w = 0; w < dst.Width; w++)
                    {
                        Color pcSrc = dst.GetPixel(w, h);

                        double y = 0;
                        y = pcSrc.R * 0.25 + pcSrc.G * 0.65 + pcSrc.B * 0.25;
                        y = y / 255 * 200 + 55;
                        if (y > 255)
                        {
                            y = 255;
                        }
                        int iy = (int)Math.Round(y);

                        int r = (int)Math.Round(iy > 85 ? ((y - 85) / 255 * 340) : 0);
                        int g = iy;
                        int b = iy > 135 ? 255 : g + 120;

                        Color pcDst = Color.FromArgb(pcSrc.A, r, g, b);
                        dst.SetPixel(w, h, pcDst);
                    }
                }
                #endregion
            }
            else if (dark && !swap)
            {
                #region Tawawa Dark Blue
                for (int h = 0; h < dst.Height; h++)
                {
                    for (int w = 0; w < dst.Width; w++)
                    {
                        Color pcSrc = dst.GetPixel(w, h);

                        double y = 0;
                        y = pcSrc.R * 0.25 + pcSrc.G * 0.60 + pcSrc.B * 0.15;
                        y = y / 255 * 200 + 55;
                        if (y > 255)
                        {
                            y = 255;
                        }
                        int iy = (int)Math.Round(y);

                        int r = (int)Math.Round(iy > 85 ? ((y - 85) / 255 * 340) : 0);
                        int g = iy;
                        int b = iy > 135 ? 255 : g + 120;

                        Color pcDst = Color.FromArgb(pcSrc.A, r, g, b);
                        dst.SetPixel(w, h, pcDst);
                    }
                }
                #endregion
            }
            else if (!dark && swap)
            {
                #region Tawawa Orange
                for (int h = 0; h < dst.Height; h++)
                {
                    for (int w = 0; w < dst.Width; w++)
                    {
                        Color pcSrc = dst.GetPixel(w, h);

                        double y = 0;
                        y = pcSrc.R * 0.33 + pcSrc.G * 0.55 + pcSrc.B * 0.20;
                        y = y / 255 * 200 + 55;
                        if (y > 255)
                        {
                            y = 255;
                        }
                        int iy = (int)Math.Round(y);

                        int r = (int)Math.Round(iy > 85 ? ((y - 85) / 255 * 340) : 0);
                        int g = iy;
                        int b = iy > 135 ? 255 : g + 120;

                        Color pcDst = Color.FromArgb(pcSrc.A, b, g, r);
                        dst.SetPixel(w, h, pcDst);
                    }
                }
                #endregion
            }
            else
            {
                #region Tawawa Dark Orange
                for (int h = 0; h < dst.Height; h++)
                {
                    for (int w = 0; w < dst.Width; w++)
                    {
                        Color  pcSrc = dst.GetPixel(w, h);
                        double y     = 0;
                        y = pcSrc.R * 0.3 + pcSrc.G * 0.59 + pcSrc.B * 0.11;
                        y = y / 255 * 200 + 55;
                        if (y > 255)
                        {
                            y = 255;
                        }
                        int iy = (int)Math.Round(y);

                        int r = (int)Math.Round(iy > 85 ? ((y - 85) / 255 * 340) : 0);
                        int g = iy;
                        int b = iy > 135 ? 255 : g + 120;

                        Color pcDst = Color.FromArgb(pcSrc.A, b, g, r);
                        dst.SetPixel(w, h, pcDst);
                    }
                }
                #endregion
            }

            Bitmap dstBmp = dst.ToManagedImage();
            //var filter = new Accord.Imaging.Filters.BrightnessCorrection(10);
            //filter.ApplyInPlace( dstBmp );

            AddinUtils.CloneExif(image, dstBmp);
            src.Dispose();
            dst.Dispose();
            return(dstBmp);
        }