Изменить соотношение сторон пикселя TIFF на квадрат - PullRequest
2 голосов
/ 21 мая 2009

Я пытаюсь выполнить распознавание штрих-кода в многостраничном TIFF-файле. Но файл TIFF приходит ко мне с факс-сервера (который я не контролирую), который сохраняет формат TIFF с соотношением сторон не квадратного пикселя. Это приводит к тому, что изображение сильно сдавливается из-за соотношения сторон. Мне нужно преобразовать формат TIFF в квадратный пиксель, но я не знаю, как это сделать в C #. Мне также нужно растянуть изображение, чтобы при изменении соотношения сторон изображение было разборчивым.

Кто-нибудь делал это в C #? Или кто-нибудь использовал библиотеку изображений, которая будет выполнять такую ​​процедуру?

Ответы [ 4 ]

6 голосов
/ 26 октября 2009

В случае, если кто-то еще столкнется с той же проблемой, вот очень простой способ, которым я в итоге решил эту надоедливую проблему.

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)));
    }
}
0 голосов
/ 21 мая 2009

Я сделал это с парой библиотек изображений, FreeImage (с открытым исходным кодом) и Snowbound. (довольно дорого) FreeImage имеет оболочку c #, а Snowbound доступен в сборке .Net. Оба работают хорошо.

Изменение их размера в коде не должно быть невозможным, но 2 цветовых оттенка иногда неудобны с GDI +.

0 голосов
/ 21 мая 2009

Отказ от ответственности: я работаю в Atalasoft

Наш .NET Imaging SDK может сделать это. Мы написали статью KB , чтобы показать, как использовать наш продукт, но вы можете адаптироваться к другим SDK. По сути, вам необходимо повторно сэмплировать изображение и настроить DPI.

0 голосов
/ 21 мая 2009

О, я забыл упомянуть. Bitmap.SetResolution может помочь с проблемами соотношения сторон. Ниже приведено только изменение размера.

Оформить Эта страница . Здесь обсуждаются два механизма изменения размера. Я подозреваю, что в вашем случае билинейная фильтрация на самом деле плохая идея, поскольку вы, вероятно, хотите, чтобы все было красиво и монохромно.

Ниже приведена копия наивного алгоритма изменения размера (написанного Кристианом Граусом со страницы, указанной выше), который должен быть тем, что вы хотите.

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

Альтернативный механизм заключается в злоупотреблении функцией GetThumbNailImage, например this . Этот код поддерживает соотношение сторон, но удаление кода, который делает это, должно быть простым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...