Pergunta

Estou tentando gerar um arquivo TIFF multipa de uma imagem existente usando Código de Bob Powell:

picture.SelectActiveFrame(FrameDimension.Page, 0);
var image = new Bitmap(picture);
using (var stream = new MemoryStream())
{
    ImageCodecInfo codecInfo = null;
    foreach (var imageEncoder in ImageCodecInfo.GetImageEncoders())
    {
        if (imageEncoder.MimeType != "image/tiff") continue;
        codecInfo = imageEncoder;
        break;
    }
    var parameters = new EncoderParameters
    {
        Param = new []
        {
            new EncoderParameter(Encoder.SaveFlag, (long) EncoderValue.MultiFrame)
        }
    };
    image.Save(stream, codecInfo, parameters);

    parameters = new EncoderParameters
    {
        Param = new[]
        {
            new EncoderParameter(Encoder.SaveFlag, (long) EncoderValue.FrameDimensionPage)
        }
    };
    for (var i = 1; i < picture.GetFrameCount(FrameDimension.Page); i++)
    {
        picture.SelectActiveFrame(FrameDimension.Page, i);
        var img = new Bitmap(picture);
        image.SaveAdd(img, parameters);

    }

    parameters = new EncoderParameters
    {
        Param = new[] 
        {
            new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.Flush) 
        }
    };
    image.SaveAdd(parameters);
    stream.Flush();
}

Mas não está funcionando (apenas o primeiro quadro está incluído na imagem) e eu não sei por quê.

O que eu quero fazer é alterar um quadro específico de um arquivo TIFF (adicione anotações a ele).

Não sei se há uma maneira mais simples de fazê -lo, mas o que tenho em mente é criar um TIFF multipa a partir da imagem original e adicionar minha própria imagem em vez desse quadro.

Foi útil?

Solução 2

Parece que esse processo não altera o objeto de imagem, mas altera o fluxo, então eu devo obter o buffer de fluxo de memória e criar outro objeto de imagem:

var buffer=stream.GetBuffer();
using(var newStream=new MemoryStream(buffer))
{
var result=Image.FromStream(newStream);
}

Agora, o resultado incluirá todos os quadros.

Outras dicas

Primeira parte deletada após comentário

Estou trabalhando com tiffs de várias páginas usando Libtiff.net; Encontrei muitos mondimentos de movimentação do TIFF usando as bibliotecas padrão (falhas relacionadas à memória e também consistentes em imagens em escala de cinza de 16 bits).

Qual é a sua imagem de teste? Você já experimentou um TIFF de várias quadros (de preferência com um grande '1' no primeiro quadro, um '2 no próximo etc; isso pode ajudá-lo a ter certeza no quadro incluído no arquivo.

Outro diagnóstico útil pode ser o utilitário Tiffdump, conforme incluído nos binários da Libtiff (também para Windows). Isso lhe dirá exatamente quais quadros você tem.

Ver Usando a Libtiff de C# para acessar imagens TIFF de azulejos

Editar Se você quiser entender o material .NET: encontrei um novo recurso em TIFFs de várias páginas usando a funcionalidade .NET padrão (embora eu fique com Libtiff.net): O Projeto de Code: Salvar imagens em um arquivo TIFF de várias páginas ... Se você baixar, o snippet de código no Form1.cs function SavemultiPage (..) é semelhante (mas ainda um pouco diferente) do seu código. Especialmente a descarga no final é feita de uma maneira diferente, e o arquivo é excluído antes do primeiro quadro .../Editar

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top