Question

Je suis en train d'effectuer la reconnaissance de codes à barres sur un fichier TIFF multipages. Mais le fichier tiff vient me d'un serveur de télécopie (que je n'ai pas le contrôle) qui enregistre le tiff avec un rapport d'aspect de pixel non carré. Ceci est à l'origine de l'image devant être mal écrasé en raison du rapport d'aspect. Je dois convertir le tiff à un rapport d'aspect de pixel carré, mais ne sais pas comment le faire en C #. Je dois aussi d'étirer l'image afin de changer le rapport d'aspect fait encore l'image lisible.

Quelqu'un at-il fait cela en C #? Ou quelqu'un a utilisé une bibliothèque d'images qui effectuera une telle procédure?

Était-ce utile?

La solution

Dans le cas où quelqu'un d'autre là-bas se jette dans la même question, voici la façon super simple j'ai fini par résolution de ce problème ennuyeux.

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)));
    }
}

Autres conseils

Oh, j'oublié de mentionner. Bitmap.SetResolution peut aider avec les questions de ratio d'aspect. Les trucs ci-dessous est à peu près le redimensionnement.

Consultez Cette page . Il traite de deux mécanismes de redimensionnement. Je soupçonne que dans votre cas filtrage bilinéaire est en fait une mauvaise idée, puisque vous voulez probablement de belles choses et monochrome.

Voici une copie de l'algorithme de modification de taille naïve (écrit par Christian Graus, de la page liée ci-dessus), qui devrait être ce que vous voulez.

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;
}

Un autre mécanisme consiste à abuser de la fonction GetThumbNailImage comme cette . Ce code maintient rapport d'aspect, mais en supprimant le code qui fait cela devrait être simple.

Je l'ai fait avec deux bibliothèques d'images, FreeImage (open source) et Snowbound. (Assez cher) FreeImage a un c # et emballage Snowbound est disponible dans un assemblage .Net. Les deux fonctionnent bien.

les redimensionnant dans le code ne devrait pas être impossible, mais 2 tiff de couleur sont parfois maladroits avec GDI +.

Disclaimer: Je travaille à Atalasoft

.NET SDK imagerie peut le faire. Nous avons écrit un article de KB pour montrer comment utiliser notre produit, mais vous pouvez adapter à d'autres kits de développement. Fondamentalement, vous devez rééchantillonner l'image et régler le DPI.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top