Изменить соотношение сторон пикселя tiff на квадратное.
-
23-08-2019 - |
Вопрос
Я пытаюсь выполнить распознавание штрих-кода в многостраничном файле Tiff.Но файл TIFF приходит ко мне с факс-сервера (который я не контролирую), который сохраняет TIFF с неквадратным соотношением сторон пикселей.Это приводит к сильному сжатию изображения из-за соотношения сторон.Мне нужно преобразовать формат tiff в квадратный пиксель, но я не знаю, как это сделать на C#.Мне также нужно будет растянуть изображение так, чтобы изменение соотношения сторон по-прежнему делало изображение разборчивым.
Кто-нибудь сделал это на C#?Или кто-нибудь использовал библиотеку изображений, которая выполнит такую процедуру?
Решение
Если кто-то еще столкнется с той же проблемой, вот очень простой способ решить эту досадную проблему.
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)));
}
}
Другие советы
Ой, я забыл упомянуть. 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
функционировать как этот.Этот код поддерживает соотношение сторон, но удалить код, который это делает, должно быть просто.
Я сделал это с помощью нескольких библиотек изображений: FreeImage (с открытым исходным кодом) и Snowbound.(довольно дорого) FreeImage имеет оболочку C#, а Snowbound доступен в сборке .Net.Оба работают хорошо.
Изменение их размера в коде не должно быть невозможным, но использование двух цветных TIFF иногда неудобно при использовании GDI+.
Отказ от ответственности:Я работаю в Аталасофт
Наш SDK для обработки изображений .NET могу это сделать.Мы написали статья базы знаний чтобы показать, как использовать наш продукт, но вы можете адаптировать его и к другим SDK.По сути, вам нужно изменить размер изображения и настроить DPI.