Обрезка GIF-изображения в C # без дополнений - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь обрезать GIF-изображения в C # без использования надстроек с рисованием прямоугольника на изображении (и я получил его для работы с обычным изображением), но .. давайте просто скажем, что результат меньшечем оптимально .. примеры:

Origianl Изображение:
Origianl Image

Обрезанное изображение:
Cropped Image

и вот код, который яиспользуя:

public override Image Crop(Rectangle f, bool isStrch, int slashwid, int slashhei)
    {
        _revert = Image;
        GifDecoder();
        widmult = Width / (double)slashwid;
        heimult = Height / (double)slashhei;
        double num = (double)f.X * widmult;
        double num2 = (double)f.Y * heimult;
        double num3 = (double)f.Width * widmult;
        double num4 = (double)f.Height * heimult;
        Rectangle srcRect = new Rectangle(isStrch ? ((int)num) : f.X, isStrch ? ((int)num2) : f.Y, isStrch ? ((int)num3) : f.Width, isStrch ? ((int)num4) : f.Height);
        CroppedFrames = new Image[Frames.Length];            
        for (int i = 0; i < Frames.Length; i++)
        {

            Bitmap image = new Bitmap(Frames[i]);
            Bitmap bitmap = new Bitmap(srcRect.Width, srcRect.Height);
            using (Graphics graphics = Graphics.FromImage(bitmap))
            {
                graphics.DrawImage(image, new Rectangle(0, 0, bitmap.Width, bitmap.Height), srcRect, GraphicsUnit.Pixel);
            }
            CroppedFrames[i] = bitmap;
        }
        GifEncoder(f.Width,f.Height);
        return Image;
    }


private void GifDecoder()
    {
        Stream bitmapStream = new FileStream(Path, FileMode.Open, FileAccess.Read, FileShare.Read);
        GifBitmapDecoder gifBitmapDecoder = new GifBitmapDecoder(bitmapStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
        Frames = new Image[gifBitmapDecoder.Frames.Count];
        for (int i = 0; i < gifBitmapDecoder.Frames.Count; i++)
        {
            Frames[i] = BitmapFromSource(gifBitmapDecoder.Frames[i]);
        }
    }

private void GifEncoder(int width,int height)
    {
        BitmapPalette palette = new BitmapPalette(BitmapImageFromImage(Image),256);

        int bytecount = (width * height) / 8;
        using (FileStream fs = new FileStream(Path + "output.gif", FileMode.Create))
        {
            GifBitmapEncoder encoder = new GifBitmapEncoder();

            for (int f = 0; f < Frames.Length; f++)
            {
                byte[] pixels = imageToByteArray(CroppedFrames[f]);

                BitmapSource image = BitmapSource.Create(width,height,96,96,System.Windows.Media.PixelFormats.Indexed8,palette,pixels,width);

                encoder.Frames.Add(BitmapFrame.Create(image));

            }
            encoder.Save(fs);
            Image = Image.FromStream(fs);
            fs.Close();

        }
    }


private byte[] imageToByteArray(Image imageIn)
    {
        MemoryStream ms = new MemoryStream();
        Bitmap aaa = new Bitmap(imageIn);
        aaa.Save(ms, ImageFormat.Png);
        return ms.ToArray();
    }

(bool isStrch, int slashwid, int slashhei) для проверки того, меньше ли изображение в картинке, или нет для точного кадрирования с помощью прямоугольника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...