C#을 사용하여 저해상도 형태로 고해상도 이미지를 제공하는 방법
-
09-09-2019 - |
문제
웹에 디스플레이하기 위해 300dpi tif 이미지를 사용하려고합니다. 현재 사용자가 이미지를 업로드하면 썸네일을 동적으로 생성하고 있습니다. 폭이 500x500px 인 고해상도 이미지를 참조하는 페이지가 생성되면 동일한 기능을 사용하여 즉시 GIF/JPG로 변환 할 수 있습니까? JPG의 임박한 해상도는 무엇입니까?
편집하다:
사용법을 자세히 설명하기 위해 사용자는 약 3000x3000 픽셀 인 300dpi 이미지를 업로드합니다. 사용자는이 이미지를 사용하여 PDF 인쇄에 사용될 카탈로그 페이지를 만듭니다. 페이지를 만들 때 화면에 표시하려면 72dpi 이미지 만 필요하지만 인쇄하려면 300dpi 이미지가 필요합니다. 분명히 그들은 페이지에 3000x3000px 이미지를 추가하고 싶지 않으므로 올바른 시청 영역 (예 : 500x500px 등)으로 크기를 조정해야합니다.
해결책
이것은 간단한 이미지 크기 조정으로 요약됩니다. DPI에 대한 논의는 스케일 계수를 계산하기위한 보조 데이터 일뿐입니다.
@guffa가 말했듯이, 업로드 시점 에이 작업을 수행하여 시청자에게 정적 이미지를 제공 할 수 있도록해야합니다.
이것은 서버의로드가 될 것입니다.
- 전체 이미지를로드하십시오. 이것은 3000x3000 이미지의 경우 약 27MB의 메모리입니다.
- 크기를 조정하십시오. 로트의 수학은 게으르게 수행되었습니다 (여전히 CPU 집약적).
- 압박 붕대. 더 많은 CPU + 드라이브에 쓰기 비용.
이미 썸네일을 생성하는 데 시간이 걸리고 있기 때문에 위의 1 단계를 반복하지 않아도 해당 비용과 비용을 상각 할 수 있습니다 (코드 참조).
이미지가 고갈 된 후에는이 작업을 수행하기 위해 스레드를 회전시키는 것이 좋습니다. 확실히 웹 서버의로드이지만 다른 옵션만이 작업을 수행하는 데 두 번째 기계를 바치는 것입니다. 결국 이루어져야합니다.
다음은 작업을 수행하는 코드입니다. 중요한 선은 다음과 같습니다.
OutputAsJpeg(Resize(big, 300.0, 72.0), new FileStream("ScreenView.jpg"));
OutputAsJpeg(Resize(big, bigSize, 64.0), new FileStream("Thumbnail.jpg"));
우리는 크기를 조정할 수 있습니다 big
그러나 이미지가 필요합니다. 첫 번째 줄에서 우리는 단지 고정 스케일 (72.0 / 300.0)으로 축소합니다. 두 번째 줄에서는 이미지의 최종 최대 치수가 64 (스케일 팩터 = 64.0 / 3000.0)를 갖도록 강요합니다.
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.IO;
BitmapSource Resize(BitmapSource original,
double originalScale,
double newScale) {
double s = newScale / originalScale;
return new TransformedBitmap(original, new ScaleTransform(s, s));
}
void OutputAsJpeg(BitmapSource src, Stream out) {
var encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(src));
encoder.Save(out);
}
// Load up your bitmap from the file system or whatever,
// then dump it out to a smaller version and a thumbnail.
// Assumes thumbnails have a max dimension of 64
BitmapSource big = new BitmapImage(new Uri("BigPage0.png",
UriKind. RelativeOrAbsolute));
double bigSize = Math.Max(big.PixelWidth, big.PixelHeight);
OutputAsJpeg(Resize(big, 300.0, 72.0), new FileStream("ScreenView.jpg"));
OutputAsJpeg(Resize(big, bigSize, 64.0), new FileStream("Thumbnail.jpg"));
다른 팁
웹 디스플레이를 위해 매우 높은 해상도 TIF의 GIF 또는 JPG 썸네일을 만들려고하는 것이 당신이 원하는 것을 이해한다면 - 미리 사과드립니다 ....
썸네일이 500x500px가 되려면 -500x500 또는 500x <500 또는 <500x500을 만들려면 JPG/GIF의 해상도입니다 (왜곡 된 이미지를 원하지 않는 한).
웹에 표시하려면 DPI가 중요하지 않습니다. 원하는 픽셀 해상도를 직접 사용하십시오.
기술적으로 JPG/GIF는 .NET의 이미지 클래스에 의해 72-DPI에서 작성됩니다. 그러나 DPI는 실제로 브라우저에 아무런 의미가 없습니다. 차원 500x500 만 사용합니다.
웹에 이미지를 표시 할 때 DPI (또는 더 정확하게 PPI) 설정은 관련이 없습니다. 관련된 픽셀 크기 일뿐입니다.
즉석에서 이미지를 변환 할 수 있지만 이미지가 표시 될 때마다 서버가이를 수행하는 것이 매우 효과적입니다. 사용자가 이미지를 업로드 할 때 필요한 크기를 만들어야합니다.