Анимация XNA Gif - PullRequest
       20

Анимация XNA Gif

1 голос
/ 18 марта 2012

я редактирую Библиотека анимации XNA Gif потому что это не работает должным образом загружает GIF-файл, но с неправильными цветами

здесь его код импорта

public override GifAnimationContent Import(string filename, ContentImporterContext context)
    {
        GifAnimationContent content = new GifAnimationContent();
        Image source = Image.FromFile(filename);
        FrameDimension dimension = new FrameDimension(source.FrameDimensionsList[0]);
        int frameCount = source.GetFrameCount(dimension);
        content.Frames = new TextureData[frameCount];
        for (int i = 0; i < frameCount; i++)
        {
            source.SelectActiveFrame(dimension, i);
            byte[] buffer = Quantizer.Quantize(source);
            content.Frames[i].__1__SurfaceFormat = SurfaceFormat.Color;
            content.Frames[i].__2__Width = source.Width;
            content.Frames[i].__3__Height = source.Height;
            content.Frames[i].__4__Levels = 1;
            content.Frames[i].Data = buffer;
        }
        source.Dispose();
        return content;
    }

Я думаю, что проблема в SurfaceFormat.Color, потому что файлы Gif больше ничего не поддерживают кроме индексированной палитры но я не могу понять, какой SurfaceFormat будет правильным или какие преобразования файлов должны быть выполнены на изображении gif для правильной работы

Пожалуйста, помогите

Спасибо.

1 Ответ

1 голос
/ 13 октября 2016

Я знаю, что это примерно на миллион лет позже, но в случае, как и я, вы сталкиваетесь с этой проблемой в любой момент времени, вот что я сделал, чтобы исправить ее после некоторого исследования.

Решение дляэто открыть исходный код для квантователя, чтобы посмотреть на квантование, а в разделе, который назначает байты от объекта-указателя на байтовый массив, вы можете просто поменять местами первый и третий байты (байты для красного и синего значений), и этодолжен исправить это.

Но так как я здесь, я могу также поделиться другой вещью, которую я сделал, которая резко ускоряет квантование с помощью Marshal.Copy для копирования байтов из указателя в массив байтов.Я не знаю, есть ли какие-либо недостатки в этом деле или ситуация, когда это нежелательно, поэтому, если кто-то знает иначе, я бы хотел это услышать.

Так что просто измените

        BitmapData bitmapdata = image.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
        byte* numPtr = (byte*)bitmapdata.Scan0.ToPointer();
        int index = 0;
        byte[] buffer = new byte[(source.Width * source.Height) * 4];
        for(int i = 0; i < source.Width; i++) {
            for(int j = 0; j < source.Height; j++) {
                buffer[index] = numPtr[index];
                index++;
                buffer[index] = numPtr[index];
                index++;
                buffer[index] = numPtr[index];
                index++;
                buffer[index] = numPtr[index];
                index++;
            }
        }
        image.UnlockBits(bitmapdata);
        return buffer;

до

        BitmapData bitmapdata = copy.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
        byte[] bytes = new byte[source.Width * source.Height * 4];

        //copy the bytes from the Scan0 pointer to our byte array
        Marshal.Copy(bitmapdata.Scan0, bytes, 0, bytes.Length);

        //swap the red and blue bytes
        for(int a = 0; a < bytes.Length; a += 4) {
            byte tmp = bytes[a];
            bytes[a] = bytes[a + 2];
            bytes[a + 2] = tmp;
        }

        copy.UnlockBits(bitmapdata);

        return bytes;

Это решение прекрасно работает и работает быстрее, чем исходный код, что важно, если вы пытаетесь использовать его в реальном времени, как я.Чтобы еще больше ускорить его, я удалил бит, в котором оно перерисовало изображение, в отдельное растровое изображение, потому что я не знаю, почему он сделал это с самого начала, и я не видел в этом необходимости, но могу ошибаться.

Также я не знаю, есть ли более быстрый способ поменять красные и синие байты, я хотел бы услышать, есть ли лучший способ сделать это тоже.Если кто-нибудь когда-нибудь и прочитает это ...

...