Hej czy w c# da sie skalowac obrazki jpeg?
Jesli tak to w jaki sposob.
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.
pojawiło sie mnóstwo errorów,
czy trzeba cos zaimportowac ?
A jakie konkretnie errory się pojawiły ?
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
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
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
a sorki juz znalazlam zła namespace
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
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.
A jak mogłabym te dwie funkcje
thumbnailImage, qualityImage
wsadzic w inna klase tak dla porzadku i potem z nich skorzystac?
Polecam tą książkę na początek:
http://polishwords.com.pl/blog/2008/jezyk-c-i-platforma-net-wydanie-ii/
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:
'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.
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).
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.
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.
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();
}
}
}
}
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 :)
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.
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 ;)