문제

웹에 디스플레이하기 위해 300dpi tif 이미지를 사용하려고합니다. 현재 사용자가 이미지를 업로드하면 썸네일을 동적으로 생성하고 있습니다. 폭이 500x500px 인 고해상도 이미지를 참조하는 페이지가 생성되면 동일한 기능을 사용하여 즉시 GIF/JPG로 변환 할 수 있습니까? JPG의 임박한 해상도는 무엇입니까?

편집하다:

사용법을 자세히 설명하기 위해 사용자는 약 3000x3000 픽셀 인 300dpi 이미지를 업로드합니다. 사용자는이 이미지를 사용하여 PDF 인쇄에 사용될 카탈로그 페이지를 만듭니다. 페이지를 만들 때 화면에 표시하려면 72dpi 이미지 만 필요하지만 인쇄하려면 300dpi 이미지가 필요합니다. 분명히 그들은 페이지에 3000x3000px 이미지를 추가하고 싶지 않으므로 올바른 시청 영역 (예 : 500x500px 등)으로 크기를 조정해야합니다.

도움이 되었습니까?

해결책

이것은 간단한 이미지 크기 조정으로 요약됩니다. DPI에 대한 논의는 스케일 계수를 계산하기위한 보조 데이터 일뿐입니다.

@guffa가 말했듯이, 업로드 시점 에이 작업을 수행하여 시청자에게 정적 이미지를 제공 할 수 있도록해야합니다.

이것은 서버의로드가 될 것입니다.

  1. 전체 이미지를로드하십시오. 이것은 3000x3000 이미지의 경우 약 27MB의 메모리입니다.
  2. 크기를 조정하십시오. 로트의 수학은 게으르게 수행되었습니다 (여전히 CPU 집약적).
  3. 압박 붕대. 더 많은 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) 설정은 관련이 없습니다. 관련된 픽셀 크기 일뿐입니다.

즉석에서 이미지를 변환 할 수 있지만 이미지가 표시 될 때마다 서버가이를 수행하는 것이 매우 효과적입니다. 사용자가 이미지를 업로드 할 때 필요한 크기를 만들어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top