Paint.net плагины типов файлов - PullRequest
3 голосов
/ 28 июня 2010

Не могу найти какую-либо информацию о том, как написать плагин типа файла для Paint.net.Я нашел только шаблон Visual Studio в http://forums.getpaint.net/index.php?/topic/7984-filetype-plugin-template-v20/page__p__121651&#entry121651

и небольшое описание в codeproject, но я не понимаю все параметры обработчика событий OnSave, что такое PaintDotNet.Surface и как работать с сохраненными даннымиесть.

1 Ответ

8 голосов
/ 29 июня 2010

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

Начните с добавления ссылок на PaintDotnet.Base, PaintDotNet.Core и PaintDotNet.Data.

Далее вам понадобится класс, который наследуется от класса FileType:

Например:

public class SampleFileType : FileType
{
    public SampleFileType() : base ("Sample file type", FileTypeFlags.SupportsSaving |
                                FileTypeFlags.SupportsLoading,
                                new string[] { ".sample" })
    {

    }

    protected override void OnSave(Document input, System.IO.Stream output, SaveConfigToken token, Surface scratchSurface, ProgressEventHandler callback)
    {
        //Here you get the image from Paint.NET and you'll have to convert it
        //and write the resulting bytes to the output stream (this will save it to the specified file)

        using (RenderArgs ra = new RenderArgs(new Surface(input.Size)))
        {
            //You must call this to prepare the bitmap
                    input.Render(ra);

            //Now you can access the bitmap and perform some logic on it
            //In this case I'm converting the bitmap to something else (byte[])
            var sampleData = ConvertBitmapToSampleFormat(ra.Bitmap);

            output.Write(sampleData, 0, sampleData.Length);                
        }
    }

    protected override Document OnLoad(System.IO.Stream input)
    {
        //Input is the binary data from the file
        //What you need to do here is convert that date to a valid instance of System.Drawing.Bitmap
        //In the end you need to return it by Document.FromImage(bitmap)

        //The ConvertFromFileToBitmap, just like the ConvertBitmapSampleFormat,
        //is simply a function which takes the binary data and converts it to a valid instance of System.Drawing.Bitmap
        //You will have to define a function like this which does whatever you want to the data

        using(var bitmap = ConvertFromFileToBitmap(input))
        {
            return Document.FromImage(bitmap);
        }
    }
}

Итак, вы наследуете от FileType. В конструкторе вы указываете, какие операции поддерживаются (загрузка / сохранение) и какие расширения файлов должны быть зарегистрированы. Затем вы предоставляете логику для операций сохранения и загрузки.

По сути, это все, что вам нужно.

Наконец, вам нужно сообщить Pain.Net, какие классы FileType вы хотите загрузить, в данном случае один экземпляр, но в одной библиотеке может быть более одного.

public class SampleFileTypeFactory : IFileTypeFactory
{
    public FileType[] GetFileTypeInstances()
    {
        return new FileType[] { new SampleFileType() };
    }

Надеюсь, это поможет, дайте мне знать, если у вас есть вопросы. }

...