2017-12-27 55 views
0

ASP.NET Core 2에서 CoreCompat 라이브러리를 사용하여 이미지를 jpeg로 압축하고 싶습니다. 다른 품질과 파일로 이미지를 변경하고 싶습니다. 크기. 문제는 품질 매개 변수에 대해 다른 값을 사용하면 동일한 파일 크기를 얻게된다는 것입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 품질을 내가 값을 0, 50, 여기에 100을 사용되었다 내 코드입니다 :CoreCompat로 압축했을 때 이미지의 크기가 달라지지 않음

const int size = 500; 
const long quality = 50L; 

string inputPath = @"D:\Images\land.jpg"; 
string outputPath = [email protected]"D:\Images\land_{quality}.jpg"; 

using (var image = new Bitmap(System.Drawing.Image.FromFile(inputPath))) 
{ 
    var resized = new Bitmap(size, size); 
    using (var graphics = Graphics.FromImage(resized)) 
    { 
     graphics.CompositingQuality = CompositingQuality.HighSpeed; 
     graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
     graphics.CompositingMode = CompositingMode.SourceCopy; 
     graphics.DrawImage(image, 0, 0, size, size); 
     using (var output = File.Open(outputPath, FileMode.Create)) 
     { 
      var qualityParamId = Encoder.Quality; 
      var encoderParameters = new EncoderParameters(1); 
      encoderParameters.Param[0] = new EncoderParameter(qualityParamId, quality); 
      var codec = ImageCodecInfo.GetImageDecoders() 
       .FirstOrDefault(c => c.FormatID == ImageFormat.Jpeg.Guid); 
      resized.Save(output, codec, encoderParameters); 
     } 
    } 
} 

내 입력 파일 lang.jpg는 크기 5메가바이트 (8386x2229)와 출력 파일 land_0.jpg, land_50.jpg 및 land_100.jpg있다 모두 62KB이고 크기는 500x500입니다. 이 출력 파일의 크기가 같은 이유는 무엇입니까?

답변

0

품질 조정을 통해 파일 크기가 작아지는 것을 보장 할 수는 없으며 압축률이 "손실"되는 정도만 결정됩니다. 그러나 궁극적으로 픽셀은 픽셀이며 해당 픽셀과 해당 색을 인코딩하는 데 하나 이상의 바이트가 있어야합니다. 파일 크기를 줄이는 유일한 방법은 해상도를 줄이는 것입니다. 즉, 인코딩 할 픽셀이 적어 이미지를 표현하는 데 필요한 바이트가 적다는 것을 의미합니다.

이미지 압축은 두 가지 방식으로 작동합니다. 먼저 이미지를 인코딩하는 데 필요한 전체 바이트를 줄이려는 시도가 있습니다. GIF 및 PNG와 같은 유형에서는 색상 공간을 제한하여이 작업을 수행합니다. 예를 들어, 수백만 개가 아닌 총 256 개의 색상으로 이미지를 제한하면 더 많은 픽셀이 같은 색상을 공유하므로 특정 색상 대신 색상 색인을 사용할 수 있습니다. JPEG와 같은 경우에는 세부적인 부분을 줄여서이 작업을 수행 할 수 있습니다. 최종 결과는 거의 동일합니다. 더 많은 픽셀이 동일한 색상을 공유하게되므로 더 나은 압축이 가능합니다.

압축의 두 번째 부분은 이러한 공유 픽셀 특성을 사용하여 인코딩하는 데 필요한 전체 바이트 수를 줄임으로써 수행됩니다. 각 픽셀이 특정 색상을 인코딩하기 위해 바이트를 포함해야하는 대신 단일 색상을 인코딩하고 픽셀 세트가이를 사용한다고 말할 수 있습니다. 다른 방법으로는 개별적으로 인코딩해야하는 바이트를 공유하기 위해 자리 표시자를 사용한다는 점에서 zip 작업과 같은 방식입니다.

이 점은 압축 비율이 다양하며 압축되는 이미지/데이터에 100 % 의존한다는 것입니다. 이미지의 경우 많은 색상 및/또는 세부 묘사가 많으면 품질을 0으로 낮추더라도 실제로는 많이 달성되지 않을 수 있습니다. 일부 이미지 정보는 삭제되지만 최종 결과가 상대적으로 중요하지 않다는 정보가 너무 많습니다. 다시 품질 설정에 관계없이 500x500 픽셀은 500x500 픽셀입니다. 품질을 낮추면보다 적극적인 압축이 가능하지만 소스에 따라 공격적 압축으로 많은 바이트를 제거하지 못할 수도 있습니다.