Kép átméretezése arányosan, szépen

Képek átméretezéséhez lehet használni az Image.GetThumbnailImage metódust, aminek az egyik baja, hogy nem túl szép az átméretezett eredmény, a másik, hogy vadul képes ExternalExceptionöket és OutOfMemoryExceptionöket dobálni, ha nem tetszik neki az eredeti kép. Van más lehetőség is.

Használhatjuk például a Graphics.DrawImage metódust, ráadásul a Graphics objektumnak még az InterpolationMode tulajdonságát is be tudjuk állítani:

  private static Image ResizeImage( Image originalImage, int maxWidth, int maxHeight )
  {
    if( originalImage.Width == maxWidth && originalImage.Height == maxHeight )
    {
        return originalImage;
    }

    float ratio;
    float ratioWidth;
    float ratioHeight;

    ratioWidth = (float) maxWidth / (float) originalImage.Width;
    ratioHeight = (float) maxHeight / (float) originalImage.Height;
    ratio = ratioHeight < ratioWidth ? ratioHeight : ratioWidth;

    int destWidth = (int) ( originalImage.Width * ratio );
    int destHeight = (int) ( originalImage.Height * ratio );

    Bitmap bitmap = new Bitmap( destWidth, destHeight );
    using( Graphics g = Graphics.FromImage( (Image) bitmap ) )
    {
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        g.DrawImage( originalImage, 0, 0, destWidth, destHeight );

        return (Image) bitmap;                
    }
  }

Ha a bemenetünk stream, akkor abból az Image.FromStream metódussal lehet Image objektumot készíteni. Ha byte[], akkor még egy MemorySteam is kell és persze minden IDisposable:

    using( MemoryStream originalStream = new MemoryStream( originalContent ) )
    {
        using( Image originalImage = Image.FromStream( originalStream ) )
        {
            using( Image resizedImage = ResizeImage( originalImage, MaxWidth, MaxHeight ) )
            {
                using( MemoryStream resizedStream = new MemoryStream() )
                {
                    resizedImage.Save( resizedStream, ImageFormat.Jpeg );
                    byte[] resizedContent = resizedStream.ToArray();
                }
            }
        }
    }

Tapasztalatom szerint a 100 pixel környékére kicsinyített fényképeknél a JPEG és a PNG hasonló minőséget produkál, miközben a JPEG fájl lényegesen kisebb, nem ritkán tízszeres különbség is van.



Balássy György (MS RD, ASP.NET MVP, MCTS)

Balássy György (MS RD, ASP.NET MVP, MCTS) Villamosmérnök, a BME Automatizálási és Alkalmazott Informatikai Tanszékén webportálok fejlesztését oktatja. 2000 óta foglalkozik a Microsoft .NET platformjával, melynek meghonosításában jelentős szerepet vállalt előadóként, konzulensként és A .NET Framework és programozása című könyv társszerzőjeként. Az MSDN Kompetencia Központon belül a Portál Technológiák Csoport vezetője, szakterülete web alapú rendszerek fejlesztése és üzemeltetése. 2004-ben Magyarországon elsőként kapta meg a Most Valuable Professional címet, majd 2005 óta a Microsoft magyarországi regionális igazgatója. Publikációi a Technet Magazinban, az MSDN Kompetencia Központ honlapján és szakmai blogjában olvashatóak.

2009.08.01. 6:46:04 | Permalink | Hozzászólások: 0 | Tárgyszavak: ,


  • MOSS 2007 és least privilege

    Balássy György (MS RD, ASP.NET MVP, MCTS) A least privilege azon elvek közé tartozik, melyek követése nem egyszerű, különösen eleinte okoz némi fáradtságot, de hosszú távon biztosan megéri. Aki esetleg nem ismerné, annak röviden: ne légy admin, csak baj lehet belőle! Tökéletesen lehet levelezni, netezni, fejleszteni, debuggolni, doksit írni, olvasni, telefont szinkronizálni, CD-t írni - szinte mindent, mezei felhasználóként. Igaz, telepítéshez, üzemeltetéshez, driver debuggolásához néha elengedhetetlen, na de ki az, aki mást sem csinál, csak drivert ír és telepítget a gépén? Tovább »
  • Az IIS 7 beállításainak mentése és visszatöltése

    Balássy György (MS RD, ASP.NET MVP, MCTS) Az IIS 7 egyik legfontosabb architekturális újdonsága, hogy a webkiszolgáló beállításai XML formátumú .config kiterjesztésű állományokban tárolódnak a C:\Windows\System32\inetsrv\config mappában. Ezeknek a mentését legegyszerűbb módon parancssorból végezhetjük el, felhasználva az appcmd segédprogramot, melynek eredménye a C:\Windows\System32\inetsrv\backup mappába kerül. Tovább »


Írja meg Ön is véleményét!


Hozzászólásokat csak regisztrált, bejelentkezett felhasználóktól tudunk elfogadni!

Hozzászólások