Pergunta

Estou tentando executar o reconhecimento de código de barras em um arquivo TIFF multipage. Mas o arquivo TIFF está chegando a mim de um servidor de fax (sobre o qual não tenho controle) que salva o TIFF com uma proporção de pixel não quadrada. Isso está fazendo com que a imagem seja maltratada devido à proporção. Preciso converter o TIFF em uma proporção quadrada de pixels, mas não tenho idéia de como fazer isso em C#. Também precisarei esticar a imagem para que a alteração da proporção ainda torne a imagem legível.

Alguém fez isso em C#? Ou alguém usou uma biblioteca de imagens que executará esse procedimento?

Foi útil?

Solução

Caso qualquer outra pessoa esteja no mesmo problema, aqui está a maneira super simples de corrigir esse problema irritante.

using System.Drawing;
using System.Drawing.Imaging;

// The memoryStream contains multi-page TIFF with different
// variable pixel aspect ratios.
using (Image img = Image.FromStream(memoryStream)) {
    Guid id = img.FrameDimensionsList[0];
    FrameDimension dimension = new FrameDimension(id);
    int totalFrame = img.GetFrameCount(dimension);
    for (int i = 0; i < totalFrame; i++) {
        img.SelectActiveFrame(dimension, i);

        // Faxed documents will have an non-square pixel aspect ratio.
        // If this is the case,adjust the height so that the
        // resulting pixels are square.
        int width = img.Width;
        int height = img.Height;
        if (img.VerticalResolution < img.HorizontalResolution) {
            height = (int)(height * img.HorizontalResolution / img.VerticalResolution);
        }

        bitmaps.Add(new Bitmap(img, new Size(width, height)));
    }
}

Outras dicas

Oh, eu esqueci de mencionar. Bitmap.SetResolution pode ajudar com os problemas de proporção. O material abaixo é quase redimensionado.

Verificação de saída Esta página. Ele discute dois mecanismos para redimensionar. Suspeito que, no seu caso, a filtragem bilinear seja realmente uma má idéia, já que você provavelmente quer coisas boas e monocromáticas.

Abaixo está uma cópia do algoritmo de redimensionamento ingênuo (escrito por Christian Graus, na página vinculada acima), que deve ser o que você deseja.

public static Bitmap Resize(Bitmap b, int nWidth, int nHeight)
{
    Bitmap bTemp = (Bitmap)b.Clone();
    b = new Bitmap(nWidth, nHeight, bTemp.PixelFormat);

    double nXFactor = (double)bTemp.Width/(double)nWidth;
    double nYFactor = (double)bTemp.Height/(double)nHeight;

    for (int x = 0; x < b.Width; ++x)
        for (int y = 0; y < b.Height; ++y)
            b.SetPixel(x, y, bTemp.GetPixel((int)(Math.Floor(x * nXFactor)),
                      (int)(Math.Floor(y * nYFactor))));

    return b;
}

Um mecanismo alternativo é abusar do GetThumbNailImage função como isto. Esse código mantém a proporção de aspecto, mas removendo o código que faz isso deve ser simples.

Eu fiz isso com algumas bibliotecas de imagens, FreeImage (código aberto) e Snowbound. (bastante caro) O FreeImage possui o invólucro AC# e a neve está disponível em um conjunto .NET. Ambos funcionam bem.

Redimensioná -los em código não seria impossível, mas as duas cores às vezes são estranhas com o GDI+.

Isenção de responsabilidade: eu trabalho na Atalasoft

Nosso .NET Imaging SDK posso fazer isso. Nós escrevemos um artigo da KB Para mostrar como usar nosso produto, mas você pode se adaptar a outros SDKs. Basicamente, você precisa reampletar a imagem e ajustar o DPI.

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