3

私がやろうとしていることを説明しましょう:私は Paint.NET 用の Filetype プラグインを作成し、プラグインでさまざまなカスタム エンコーディング メソッドをテストし、最小のファイルサイズを生成するメソッドでファイルを保存したいと考えています。

これが私の実際のコードです(私がやりたいことを示すためにかなり単純化されています)。それはうまくいきましたが、まあ、コメントを見てください:

private void encode1(Stream output)
{
    output.WriteByte(0xAA);
}
private void encode2(Stream output)
{
    output.WriteByte(0xAA);
    output.WriteByte(0xBB);
}

protected override void OnSave(Stream output)
{
    if (saveSmallest)
    {
        // I can't find a clean way to test for the smallest stream size
        // and then use the encoder that produced the smallest stream...
    }
    else if (selectedEncoder == 1)
    {
        encode1(output);
    }
    else if (selectedEncoder == 2)
    {
        encode2(output);
    }
}

だからここに私が試したものがあります(これも単純化されていますが、アイデアはここにあります)が、うまくいきませんでした。

private Stream encode1()
{
    Stream output = new MemoryStream();
    output.WriteByte(0xAA);
    return output;
}
private Stream encode2()
{
    Stream output = new MemoryStream();
    output.WriteByte(0xAA);
    output.WriteByte(0xBB);
    return output;
}

private void copyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[128];
    int read;
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
    {
        output.Write(buffer, 0, read);
    }
}

protected override void OnSave(Stream output)
{
    if (saveSmallest)
    {
        // get encoders's streams
        Stream[] outputs =
        {
            encode1(),
            encode2(),
            //other encoders here
        };

        // Find the smallest stream
        int smallest = 0;
        for (int i = 1; i < outputs.Length; i++)
        {
            if (outputs[i].Length < outputs[smallest].Length)
            {
                smallest = i;
            }
        }
        //Copy the smallest into the final output
        //output = outputs[smallest];
        copyStream(outputs[smallest], output);
    }
    else if (selectedEncoder == 1)
    {
        //output = encode1();
        copyStream(encode1(), output);
    }
    else if (selectedEncoder == 2)
    {
        //output = encode2();
        copyStream(encode2(), output);
    }
}

また、ストリームの代わりにバイト配列を使用してみましたが、バイトの問題は、エンコードに必要なバイト数が明らかにわからないため、非常に大きなバイト配列を宣言する必要があることです。数百万かもしれない…

私はC#の初心者です。まったく機能しない理由と、それを修正する方法、または改善方法があれば教えてください。しかし、一度コンパイルすると 2kb 以上かかる複雑なコードを書かないでください。私は、コードを小さく、シンプルで効率的なものにしたいと考えています。低レベルのプログラミングで気分が良くなりました... よろしくお願いします!

4

1 に答える 1