Rozmiar zdjęcia po zmianie wielkośći

0

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ą

2

Proponuję sprawdzić, czy zdjęcia, w których nie zmieniłeś rozmiaru są identyczne. Najprościej zrobić to tak:

  1. Utwórz nowe obiekty typu System.Drawing.Bitmap na podstawie oryginalnego i otrzymanego pliku.
  2. Zapisz obrazy do strumienia (w .NET bitmapę można zapisać do pliku lub do strumienia) w formacie BMP lub PNG.
  3. Porównaj zawartość uzyskanych strumieni. Jeżeli zdjęcia są takie same, to i strumienie powinny być takie same.
    Aby wykluczyć ewentualny wpływ kanału alfa, na każdy plik można zrobić w ten sposób:
  4. Utwórz obiekt typu Bitmap o nazwie Bmp1 na podstawie pliku.
  5. Utwórz nowy obiekt typu Bitmap o tym samym rozmiarze i przestrzeni kolorów RGB24, nazywając go Bmp2.
  6. Utwórz nowy obiekt typu Systen.Drawing.Graphics z bitmapy Bmp2, nazywając Bmp2G.
  7. Wykorzystując obiekt Bmp2G nanieś obraz Bmp1 za pomocą DrawImage.
  8. Zapisz Bmp2 do strumienia lub pliku PNG.
0

@andrzejlisek: Sprawdziłem tak jak pisałeś, i wszystko wskazuje na to , że są identyczne

1 użytkowników online, w tym zalogowanych: 0, gości: 1