public ImageEditObject(ImageEditMode editMode, Rectangle editRect)
 {
     this.EditMode  = editMode;
     this.EditRect  = editRect;
     this.Selected  = true;
     this.Points    = new Point[0];
     this.BackBrush = new SolidBrush(Color.White);
 }
Beispiel #2
0
        async Task DoImageMagickCommand(CommandContext ctx, ImageEditMode mode, string link)
        {
            await ctx.TriggerTypingAsync().ConfigureAwait(false);

            string attachmentUrl = null;

            if (!string.IsNullOrWhiteSpace(ctx.RawArgumentString) && link != null && Uri.TryCreate(link, UriKind.Absolute, out Uri uri))
            {
                attachmentUrl = link;
            }
            else
            {
                IReadOnlyList <DiscordMessage> messages = await ctx.Channel.GetMessagesAsync(10);

                for (int i = 0; i < messages.Count; i++)
                {
                    if (messages[i].Attachments.Count != 0)
                    {
                        attachmentUrl = messages[i].Attachments[0].Url;
                        break;
                    }
                }
            }
            if (!string.IsNullOrEmpty(attachmentUrl))
            {
                HttpClient client = new HttpClient();
                byte[]     buffer;
                try
                {
                    buffer = await client.GetByteArrayAsync(attachmentUrl);
                }
                catch (HttpRequestException)
                {
                    await ctx.RespondAsync("이미지링크에 접속할수 없습니다.");

                    return;
                }
                if (attachmentUrl.EndsWith(".gif"))
                {
                    await DoImageMagickCommandForGif(ctx, buffer, mode);
                }
                else
                {
                    await DoImageMagickCommandForStillImage(ctx, buffer, mode);
                }
            }
            else
            {
                await ctx.RespondAsync("이미지 주소좀 확인해줄래요?");
            }
        }
Beispiel #3
0
        void DoMagic(ImageEditMode mode, IMagickImage image, int originalWidth, int originalHeight)
        {
            switch (mode)
            {
            case ImageEditMode.Swirl:
                image.Swirl(360);
                break;

            case ImageEditMode.Rescale:
                image.LiquidRescale(image.Width / 2, image.Height / 2);
                image.LiquidRescale((image.Width * 3) / 2, (image.Height * 3) / 2);
                image.Resize(originalWidth, originalHeight);
                break;

            case ImageEditMode.Wave:
                image.BackgroundColor = MagickColor.FromRgb(0, 0, 0);
                image.Wave(image.Interpolate, 10.0, 150.0);
                break;

            case ImageEditMode.Implode:
                image.Implode(0.5d, PixelInterpolateMethod.Average);
                break;

            case ImageEditMode.JPEG:
                image.Quality = 10;
                break;

            case ImageEditMode.MoreJPEG:
                image.Quality = 5;
                break;

            case ImageEditMode.MostJPEG:
                image.Quality = 1;
                break;

            default:
                break;
            }
        }
Beispiel #4
0
        async Task DoImageMagickCommandForStillImage(CommandContext ctx, byte[] buffer, ImageEditMode mode)
        {
            MagickImage image;

            try
            {
                image = new MagickImage(buffer);
            }
            catch (MagickMissingDelegateErrorException)
            {
                await ctx.RespondAsync("Image format not recognised.");

                return;
            }
            int originalWidth = image.Width, originalHeight = image.Height;

            if (originalHeight * originalWidth > 2250000)
            {
                await ctx.RespondAsync($"Image exceeds maximum size of 2250000 pixels (Actual size: {originalHeight * originalWidth})");

                return;
            }
            // Do magic
            double exceed  = buffer.Length / 8388608d;
            double rescale = 1f;

            if (exceed > 1.0)
            {
                rescale = 1.0 / Math.Sqrt(exceed);
            }
            if (rescale < 1f)
            {
                if (rescale < 0.5f)
                {
                    image.AdaptiveResize((int)(image.Width * rescale), (int)(image.Height * rescale));
                }
                else
                {
                    image.Resize((int)(image.Width * rescale), (int)(image.Height * rescale));
                }
            }
            DoMagic(mode, image, originalWidth, originalHeight);
            using (Stream stream = new MemoryStream())
            {
                if (mode == ImageEditMode.JPEG || mode == ImageEditMode.MoreJPEG || mode == ImageEditMode.MostJPEG)
                {
                    image.Write(stream, MagickFormat.Jpeg);
                }
                else
                {
                    image.Write(stream);
                }
                stream.Seek(0, SeekOrigin.Begin);
                if (mode == ImageEditMode.JPEG || mode == ImageEditMode.MoreJPEG || mode == ImageEditMode.MostJPEG)
                {
                    await ctx.RespondWithFileAsync(stream, "magic.jpeg");
                }
                else
                {
                    await ctx.RespondWithFileAsync(stream, "magic.png");
                }
            }
        }
Beispiel #5
0
        async Task DoImageMagickCommandForGif(CommandContext ctx, byte[] buffer, ImageEditMode mode)
        {
            if (mode == ImageEditMode.Rescale)
            {
                await ctx.RespondAsync("이 모드는 속도가 느리고 이미지사이즈에 기반해서 느려지기 때문에 gif는 지원하지 않습니다.");

                return;
            }
            MagickImageCollection image;

            try
            {
                image = new MagickImageCollection(buffer);
            }
            catch (MagickMissingDelegateErrorException)
            {
                await ctx.RespondAsync("이미지 파일확장자를 알아볼 수 없다.");

                return;
            }
            int originalWidth = image[0].Width, originalHeight = image[0].Height;

            if (originalHeight * originalWidth > 1000000)
            {
                await ctx.RespondAsync($"Gif exceeds maximum size of 1000000 pixels (Actual size: {originalHeight * originalWidth})");

                return;
            }
            if (image.Count > 100)
            {
                await ctx.RespondAsync($"Gif exceeds maximum frame count of 100 pixels (Actual count: {image.Count})");

                return;
            }
            image.Coalesce();
            long rawLength;

            using (MemoryStream stream = new MemoryStream())
            {
                image.Write(stream);
                rawLength = stream.Length;
            }
            double exceed  = rawLength / 4194304d;
            double rescale = 1f;

            if (exceed > 1.0)
            {
                rescale = Math.Sqrt(exceed);
            }
            await ctx.TriggerTypingAsync();

            for (int i = 0; i < image.Count; i++)
            {
                IMagickImage frame = image[i];
                if (rescale > 1f)
                {
                    if (rescale > 2f)
                    {
                        frame.AdaptiveResize((int)(frame.Width / rescale), (int)(frame.Height / rescale));
                    }
                    else
                    {
                        frame.Resize((int)(frame.Width / rescale), (int)(frame.Height / rescale));
                    }
                }
                DoMagic(mode, frame, originalWidth, originalHeight);
            }
            await ctx.TriggerTypingAsync();

            image.OptimizeTransparency();
            using (Stream stream = new MemoryStream())
            {
                image.Write(stream);
                stream.Seek(0, SeekOrigin.Begin);
                await ctx.RespondWithFileAsync(stream, "magic.gif");
            }
        }