TIFF 픽셀 종횡비를 정사각형으로 변경하십시오
-
23-08-2019 - |
문제
Multipage 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
종횡비 문제에 도움이 될 수 있습니다. 아래의 것들은 크기 조정에 관한 것입니다.
체크 아웃 이 페이지. 크기 조정을위한 두 가지 메커니즘에 대해 설명합니다. 나는 당신의 경우에 bilinear 필터링이 실제로 나쁜 생각이라고 생각합니다. 아마 당신은 아마도 좋은 것과 단색을 원하기 때문입니다.
아래는 순진한 크기즈 알고리즘 (위의 링크 된 페이지에서 Christian Graus가 작성)의 사본입니다.
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 (오픈 소스) 및 눈 바운드 로이 작업을 수행했습니다. (상당히 비싸다) FreeImage에는 AC# 래퍼가 있으며 .NET 어셈블리에서는 눈 바운드가 제공됩니다. 둘 다 잘 작동합니다.
코드에서 크기를 조정하는 것은 불가능하지는 않지만 2 개의 컬러 티프는 때때로 GDI+로 어색합니다.
면책 조항 : 나는 Atalasoft에서 일합니다
우리의 .NET 이미징 SDK 이것을 할 수 있습니다. 우리는 글을 썼습니다 KB 기사 제품을 사용하는 방법을 보여주기 위해 다른 SDK에 적응할 수 있습니다. 기본적으로 이미지를 다시 샘플링하고 DPI를 조정해야합니다.