skalowanie jpeg

0

Hej czy w c# da sie skalowac obrazki jpeg?
Jesli tak to w jaki sposob.

0

Da się.

        /// <summary>
        /// Tworzenie miniaturki obrazka z użyciem Graphics.DrawImage z odpowiednimi parametrami,
        /// co daje znacznie lepsze jakościowo rezultaty niż Image.GetThumbnailImage na przykład
        /// </summary>
        /// <param name="path">Ścieżka do obrazka, który ma być zmniejszony</param>
        /// <param name="newPath">Ścieżka obrazka wynikowego, zmniejszonego</param>
        /// <param name="percent">Procent zmniejszania (może być zero, wtedy użyte zostaną wartości newWidth i newHeight)</param>
        /// <param name="newWidth">Nowa szerokość obrazka (używane tylko jeśli percent = 0)</param>
        /// <param name="newHeight">Nowa wysokość obrazka (używane tylko jeśli percent = 0)</param>
        private void thumbnailImage(string path, string newPath, int percent, int newWidth, int newHeight)
        {
            Image i = Image.FromFile(path);

            if (percent != 0)
            {
                newWidth = i.Width * percent / 100;
                newHeight = i.Height * percent / 100;
            }            

            //Image th = i.GetThumbnailImage(newWidth, newHeight, new Image.GetThumbnailImageAbort(ThumbnailCallback), IntPtr.Zero);
            // loss of quality;                        
            
            Bitmap th = new Bitmap(newWidth, newHeight,
                             PixelFormat.Format24bppRgb);
            th.SetResolution(i.HorizontalResolution,
                                    i.VerticalResolution);

            Graphics grPhoto = Graphics.FromImage(th);
            grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;
            
            grPhoto.DrawImage(i,
                new Rectangle(0, 0, newWidth, newHeight),
                new Rectangle(0, 0, i.Width, i.Height),
                GraphicsUnit.Pixel);

            grPhoto.Dispose();
            
            if (path == newPath)
            {
                //string tmp = Path.GetTempFileName();
                i.Dispose();
                th.Save(newPath);
                th.Dispose();            
                //File.Delete(path);
                //File.Move(tmp, newPath);
            }
            else
            {
                if (File.Exists(newPath))
                    File.Delete(newPath);

                th.Save(newPath);
                th.Dispose();
            }
        }

Tylko problem jest taki, że funkcja powyższa zapisuje obrazek z jakością 100%, przez co jego wielkość jest zdecydowanie zbyt duża, mimo iż rozdzielczość jest mniejsza niż oryginału - do pogorszenia jakości mam taką profesjonalną funkcję:

        /// <summary>
        /// Tworzenie zmniejszonej wersji obrazka poprzez pogorszenie jakości
        /// </summary>
        /// <param name="path">Ścieżka do obrazka, który ma być zmniejszony</param>
        /// <param name="quality">Jakość (w procentach) zapisywanego obrazka</param>
        private void qualityImage(string path, int quality)
        {
            Image i = Image.FromFile(path);

            ImageCodecInfo iciJpegCodec = null;            

            EncoderParameter epQuality = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
            ImageCodecInfo[] iciCodecs = ImageCodecInfo.GetImageEncoders();
            EncoderParameters epParameters = new EncoderParameters(1);

            epParameters.Param[0] = epQuality;

            iciJpegCodec = GetEncoderInfo("image/jpeg");
            
            string tmp = Path.GetTempFileName();
            i.Save(tmp, iciJpegCodec, epParameters);
            i.Dispose();

            File.Delete(path);
            File.Move(tmp, path);            
        }

Połącz te dwie w jedno i będzie dobrze.

0

pojawiło sie mnóstwo errorów,
czy trzeba cos zaimportowac ?

0

A jakie konkretnie errory się pojawiły ?

0

Error 1 'System.Web.UI.WebControls.Image' does not contain a definition for 'FromFile'
Error 2 Operator '' cannot be applied to operands of type 'System.Web.UI.WebControls.Unit' and 'int'
Error 3 Operator '
' cannot be applied to operands of type 'System.Web.UI.WebControls.Unit' and 'int'
Error 4 The type or namespace name 'Bitmap' could not be found (are you missing a using directive or an assembly reference?)
Error 5 The type or namespace name 'Bitmap' could not be found (are you missing a using directive or an assembly reference?)
Error 6 The name 'PixelFormat' does not exist in the current context
Error 7 'System.Web.UI.WebControls.Image' does not contain a definition for 'HorizontalResolution' and no extension method 'HorizontalResolution' accepting a first argument of type 'System.Web.UI.WebControls.Image' could be found (are you missing a using directive or an assembly reference?)
Error 8 'System.Web.UI.WebControls.Image' does not contain a definition for 'VerticalResolution' and no extension method 'VerticalResolution' accepting a first argument of type 'System.Web.UI.WebControls.Image' could be found (are you missing a using directive or an assembly reference?)
Error 9 The type or namespace name 'Graphics' could not be found (are you missing a using directive or an assembly reference?)

w sumie 24 errorow

0

Używasz nie tej klasy Image co trzeba.
Poprawna klasa to: System.Drawing.Image
Klasa Bitmap oraz Graphics znajduje się w namespace System.Drawing. Dodaj odpowiednią referencję
Wszystko masz napisane

0

dodałam linijkę

using System.Drawing.Image;

co spowodowało pojawienie sie błedu

Error 1 A using namespace directive can only be applied to namespaces; 'System.Drawing.Image' is a type not a namespace

0

a sorki juz znalazlam zła namespace

0

teraz w linijce

Bitmap th = new Bitmap(newWidth, newHeight, PixelFormat.Format24bppRgb);

mam error

Error 1 The name 'PixelFormat' does not exist in the current context C:\Users\slawek\Documents\Visual Studio 2008\WebSites\gdynianka\admin\Wiadomosci\Edit.aspx.cs 135 26 C:...\gdynianka\

nie wiem o co chodzi

0

Dodaj:

using System.Drawing.Imaging.

Ogólnie jak Ci się pojawia błąd że czegoś nie ma, to wpisz nazwę tego obiektu w Google i znajdź w jakiej przestrzeni nazw się znajduje. Następnie w referencjach projektu sprawdź czy masz odpowiednią bibliotekę. Jak nie ma to dodaj. Jak masz to sprawdź czy masz usinga. Jeżeli masz referencje i klikniesz na taką klasę to pojawi się taki prostokąt w prawym dolnym rogu (VS 2008), jak klikniesz na to to od razu podpowiada jaką przestrzeń nazw dodać do projektu.

0

A jak mogłabym te dwie funkcje
thumbnailImage, qualityImage
wsadzic w inna klase tak dla porzadku i potem z nich skorzystac?

0

@TomaszSmykowski

A ja nie polecam tej ksiazki. Na dzien dzisiejszy jest ona po prostu przestarzala. Opisuje programowanie w C# pod .NET 1.1.

Polecam zaopatrzyc sie w ta pozycje:

user image
C# i .NET

'matra' napisał(a)

A jak mogłabym te dwie funkcje
thumbnailImage, qualityImage
wsadzic w inna klase tak dla porzadku i potem z nich skorzystac?

Dodaj plik nowej klasy (w Solution Explorer kliknij prawym na nazwe projektu i wybierz Add New Item -> Class) i wpisz np. cos takiego:

using System... //potrzebne biblioteki

public class Klasa
{
    public void thumbnailImage( ... )
    {
        ...
    }

    public void qualityImage( ... )
    {
        ...
    }
}

A potem tworzysz obiekt tej klasy i wywolujesz metody.

0

Też może być. Kwestia gustu. Jak już pisałem kiedyś mi odpowiada humor Troelsena.

A dla chcącego nic trudnego. Na Amazonie jest 4 wydanie ksiażki (a to świadczy o jej jakości dobrze):
http://www.amazon.com/2008-NET-Platform-Fourth-Windows-Net/dp/1590598849/ref=sr_1_1?ie=UTF8&s=books&qid=1230646148&sr=1-1

Jak najbardziej aktualna i dobra do nauki. Nawet bardziej aktualna niż Perry (który jest z lipca 2006, a Troelsen wyd. 4 jest z końca 2007).

0
TomaszSmykowski napisał(a)

Kwestia gustu.

Co ma gust do tego? [???] Przeciez to jest ksiazka technicza a nie jakies opowiadanie fantazy. Polecasz przestarzale wydanie ksiazki, ktore opisuje jakies prehistoryczne czasy .NET 1.1. Nie lepiej Od razu zaczac nauke przynajmniej od .NET 2.0? Po przeczytaniu tamtej ksiazki i tak taka osoba musialaby sila rzeczy siegnac po nowsza pozycje. Lepiej to zrobic Od razu.

TomaszSmykowski napisał(a)

A dla chcącego nic trudnego. Na Amazonie jest 4 wydanie ksiażki (a to świadczy o jej jakości dobrze)

Z tym, ze to wydanie nie jest dostepne po polsku. Wiadomo, ze jezyk angielski to podstawa w programowaniu. Jendak dla autorki tematu lepszym wyjsciem (biorac pod uwage pytania przez nia zadawane) bedzie zakup C# i .NET.

0

Tutaj jest wydanie drugie w języku polskim (z 2006 roku, tak samo jak Perry):
http://www.amigo.osdw.pl/ksiazka/Troelsen-Andrew/Jezyk-C-i-platforma-NET-w-2,45231300100KS

Na dalszą dyskusję nad wyższości jednej książki nad drugą zapraszam na PW.

0

A tak w ogóle, to zapomniałem o jeszcze jednej funkcji która tam sobie siedzi i z której korzysta qualityImage(), dlatego też mogło nie działać - przepraszam, moje niedopatrzenie.

Co do klasy: proszę. Fragment klasy w mojej aplikacji zawierający tylko to co niezbędne. Tutaj jest już jedna funkcja która robi to samo co tamte dwie razem wzięte.

/**
 * Code Name "Autonoe"
 * Ktos.Autonoe.Common.cs
 * 
 * Copyright © Marcin Badurowicz 2008 <ktos at ktos dot info>
 * 
 * Biblioteka zawierająca funkcje używane przez Autonoe, takie jak
 * reskalowanie obrazków czy znajdowanie relatywnej ścieżki.
 * 
 *  This file is part of Autonoe.
 * 
 *  Autonoe is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as 
 *  published by the Free Software Foundation; either version 3 of 
 *  the License, or (at your option) any later version.
 *
 *  Autonoe is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>
 * 
 */

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;

namespace Ktos.Autonoe
{
    public class AutonoeLib
    {
        /// <summary>
        /// Zwraca kodek dla podanego typu MIME
        /// </summary>
        private static ImageCodecInfo getEncoderInfo(string mimeType)
        {
            // pobierz wszystkie kodeki
            ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();

            // znajdź właściwy i zwróć go
            for (int i = 0; i < codecs.Length; i++)
                if (codecs[i].MimeType == mimeType)
                    return codecs[i];
            return null;
        }

        /// <summary>
        /// Zmniejszanie obrazka typu JPEG do podanej wielkości lub procentowo
        /// </summary>
        /// <param name="path">Ścieżka oryginalnego pliku</param>
        /// <param name="newPath">Ścieżka nowego (zmniejszonego) pliku</param>
        /// <param name="percent">Procent zmniejszania</param>
        /// <param name="newWidth">Nowa szerokość (jeśli <see cref="percent"/> równe 0)</param>
        /// <param name="newHeight">Nowa wysokość (jeśli <see cref="percent"/> równe 0)</param>
        /// <param name="quality">Jakość (od 0 do 100), im wyższa tym lepsza (ale i większy plik)</param>
        public static void ResizeImage(string path, string newPath, int percent, int newWidth, int newHeight,
            int quality)
        {
            // otwieranie obrazka
            Image i = Image.FromFile(path);

            if (percent != 0)
            {
                newWidth = i.Width * percent / 100;
                newHeight = i.Height * percent / 100;
            }
            else if ((newWidth == 0) || (newHeight == 0))
                throw new IndexOutOfRangeException("Cannot resize images to 0 pixels!");            

            Bitmap th = new Bitmap(newWidth, newHeight, PixelFormat.Format24bppRgb);
            th.SetResolution(i.HorizontalResolution, i.VerticalResolution);

            Graphics grPhoto = Graphics.FromImage(th);
            
            // reskalowanie sposobem HighQualityBicubic
            grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;

            grPhoto.DrawImage(i,
                new Rectangle(0, 0, newWidth, newHeight),
                new Rectangle(0, 0, i.Width, i.Height),
                GraphicsUnit.Pixel);

            grPhoto.Dispose();
            i.Dispose();

            // pobieranie informacji o enkoderze dla JPEG
            ImageCodecInfo iciJpegCodec = null;
            EncoderParameter epQuality = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
            ImageCodecInfo[] iciCodecs = ImageCodecInfo.GetImageEncoders();
            EncoderParameters epParameters = new EncoderParameters(1);
            epParameters.Param[0] = epQuality;
            iciJpegCodec = getEncoderInfo("image/jpeg");

            if (path == newPath)
            {
                // zapis do pliku tymczasowego z odpowiednimi parametrami
                string tmp = Path.GetTempFileName();
                th.Save(tmp, iciJpegCodec, epParameters);
                th.Dispose();

                // usunięcie oryginalnego pliku i podmiana na plik tymczasowy
                File.Delete(path);
                File.Move(tmp, path);

                // dlaczego takie kombinacje? ano dlatego, żeby uniknąć
                // "Generic GDI+ Error", który się tutaj mógł pojawiać
            }
            else
            {
                th.Save(newPath, iciJpegCodec, epParameters);
                th.Dispose();
            }
        }
    }
}
0
TomaszSmykowski napisał(a)

Tutaj masz wydanie drugie:
http://www.amigo.osdw.pl/ksiazka/Troelsen-Andrew/Jezyk-C-i-platforma-NET-w-2,45231300100KS

Przeciez podawales wczesniej inny link do tego przestarzalego wydania. Po co sie powtarzasz?

TomaszSmykowski napisał(a)

Tak samo jak Twój Perry z 2006 roku. W języku polskim !

2006 to rok polskiego wydania. Oryginalne II wydanie tej ksiazki mialo miejsce w 2003 roku. I widze, ze ta dyskuja budzi silne emocje u Ciebie.

TomaszSmykowski napisał(a)

Co ma gust do tego? [???] Przeciez to jest ksiazka technicza a nie jakies opowiadanie fantazy.

Bez sensu jest to co piszesz. Sorry, ale jak dwie książki traktują
dokładnie o tym samym, to wolę czytać książkę autora który umie
pisać składnie i ciekawie. Nie rozumiem o co Ci chodzi z tym fantazy. [???]

Ksiazka technicza ma przedstawiac informacje, ktore sa uzyteczne. Takie, ktore moge wykorzystac w swojej codziennej pracy. Nie sa mi potrzebne pieknie zbudowane zdania z lekkim humorem. Jest to zwyczajnie zbedne bo do niczego mi sie to nie przyda. Interesuja mnie suche fakty jak dana rzecz nalezy uzywac i jak to mozna wykorzystac.

TomaszSmykowski napisał(a)

Polecasz przestarzale wydanie ksiazki,

Podałem link do 4 wydania, a teraz jeszcze do 2 wydania.
O co Ci chodzi znowu [???]

Podales dopiero jak zareagowalem, ze to wydanie jest przestarzale. A link do wydania II podales na samym poczatku, a teraz podales inny link do tego samego wydania.

TomaszSmykowski napisał(a)

Jendak dla autorki tematu lepszym wyjsciem (biorac pod uwage pytania przez nia zadawane) bedzie zakup C# i .NET.

Nie rezerwuj sobie prawa do wiedzy co jest dla kogoś lepsze,
gdy tego nie wiesz.
</quote>

Z tym, ze to widac jak dla dloni. Autorka nie umie nawet zrozumiec prostych komunikatow w jezyku angielskim. Oczywiscie bez obrazy dla autorki tematu :)

0

2006 to rok polskiego wydania. Oryginalne II wydanie tej ksiazki mialo miejsce w 2003 roku.

No racja. Dodatkowo nie wydano po polsku 3 ani 4 wydania Troelsena.

I widze, ze ta dyskuja budzi silne emocje u Ciebie.

Hehe. Dobre :-D

Ksiazka technicza ma przedstawiac informacje, ktore sa uzyteczne. Takie, ktore moge wykorzystac w swojej codziennej pracy. Nie sa mi potrzebne pieknie zbudowane zdania z lekkim humorem. Jest to zwyczajnie zbedne bo do niczego mi sie to nie przyda. Interesuja mnie suche fakty jak dana rzecz nalezy uzywac i jak to mozna wykorzystac.

No i widzisz. Tu się różnimy. Bo ja chcąc suchych faktów sięgam po dokumentację i manuale. A książki kupuję żeby spędzić miło czas przy ciekawej lekturze. Techniczne książki mogą być przyjemne w czytaniu i Troelsen tego dowodzi. Zresztą nie tylko on, Wróblewski, Connell, Gardner, Jeff Atwood.
http://www.codinghorror.com/blog/

Jest kilku programistów na świecie którzy oprócz talentu technicznego mają talent pisarski.

Podales dopiero jak zareagowalem, ze to wydanie jest przestarzale. A link do wydania II podales na samym poczatku, a teraz podales inny link do tego samego wydania.

No ok. Zareagowałeś, ja poprawiłem i jest ok. :-)

Z tym, ze to widac jak dla dloni. Autorka nie umie nawet zrozumiec prostych komunikatow w jezyku angielskim. Oczywiscie bez obrazy dla autorki tematu :)

Z jednej strony piszesz że autorka wymaga przystępnych treści, a z drugiej piszesz o tym że programistyczne ksiażki telefoniczne są ok. No to trzeba zdecydować się. ;-)

Jak już pisałem, do dalszej dyskusji zapraszam na PW. Albo na mejla, którego zresztą znasz.

0
matra napisał(a)

A jak mogłabym te dwie funkcje
thumbnailImage, qualityImage
wsadzic w inna klase tak dla porzadku i potem z nich skorzystac?

Utwórz sobie klasę statyczna na przykład.
Dodaj te metody jako publiczne i statyczne i masz już jakiś porządek ;)

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