Gerar um TIFF multipage não está funcionando
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.
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