Cześć!
Mam pewien problem a może bardziej pytanie, piszę program konsolowy który kompresuje i zmniejsza zdjęcia, i sytuacja wygląda tak, że jeżeli użyje metody do zmiany rozmiaru i ustawie dokładnie ten sam rozmiar zdjęcia co oryginalny to zajmuje on mniej pamięci niż zdjęcie oryginalne oraz zdjęcie po kompresji a używam tego samego codera.Chodzi mi o rozszerzenie .tif
Poniżej wklejam część kodu
Zmiana rozmiaru zdjęcia
destRect = new Rectangle(0, 0, width, height);
destImage = new Bitmap(width, height);
destImage.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);
using (var graphics = Graphics.FromImage(destImage))
{
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
using (var wrapMode = new ImageAttributes())
{
wrapMode.SetWrapMode(WrapMode.TileFlipXY);
graphics.DrawImage(imgPhoto, destRect, 0, 0, imgPhoto.Width, imgPhoto.Height, GraphicsUnit.Pixel, wrapMode);
}
}
string fileExtension = Path.GetExtension(path).ToLower();
string savePath = path.Remove(path.Length - 4, 4);
Bitmap image = destImage;
Encoder enc = Encoder.Compression;
EncoderParameters encoderParameters = new EncoderParameters(1);
EncoderParameter encoderParameter = new EncoderParameter(enc, (long)EncoderValue.CompressionNone);
encoderParameters.Param[0] = encoderParameter;
switch (fileExtension)
{
case ".tiff":
case ".tif":
image.Save(savePath + "_resized" + fileExtension, GetEncoder(ImageFormat.Tiff), encoderParameters);
break;
Metoda GetEncoder
public static ImageCodecInfo GetEncoder(ImageFormat format)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
foreach (ImageCodecInfo codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}
Część kodu do kompresji
case ".tiff":
case ".tif":
{
enc = Encoder.Compression;
encoderParameters = new EncoderParameters(1);
encoderParameter = new EncoderParameter(enc, (long)EncoderValue.CompressionLZW);
encoderParameters.Param[0] = encoderParameter;
bmp.Save(ms, GetEncoder(ImageFormat.Tiff), encoderParameters);
if (Math.Round(((ms.Length / 1024f) / 1024f), 2) >= sizeInMBytes)
{
if (Format(path).ToLower().Equals("tiff"))
{
Console.WriteLine("Dla tego formatu nie da sie uzyskać lepszej kompresji");
}
else
{
Console.WriteLine("Nie da sie bardziej skompresować, zmień na wcześniejszy format: " + Format(path));
}
}
else
{
if (fileExtension.Equals(".tiff"))
{
filePath = path.Remove(path.Length - 5, 5);
}
else
{
filePath = path.Remove(path.Length - 4, 4);
}
bmp.Save(filePath + "_compress" + fileExtension, GetEncoder(ImageFormat.Tiff), encoderParameters);
}
Rezultat jest taki:
Oryginalne zdjęcie (w formacie .tif) - 204MB
Zdjęcie po skompresowaniu(przy uzyciu formatu .tiff oraz kompresji LZW) - 199MB
Zdjęcie po skorzystaniu z zmiany rozmiaru (ustawiając dokładnie taki sam rozmiar), oraz ustawieniu kompresji na compressionNone - 32,6MB
Możliwe że jest to banalne pytanie, ale byłbym wdzięczny jakby ktoś wytłumaczył skąd się takie różnice biorą