Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Obrada slika (on the fly) u asp.net

[es] :: .NET :: ASP.NET :: Obrada slika (on the fly) u asp.net

[ Pregleda: 2345 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

sulja
Dejan Stojanovic
Pozarevac

Član broj: 1140
Poruke: 91
*.evizo.net.

Sajt: www.anthill.co.rs


Profil

icon Obrada slika (on the fly) u asp.net30.04.2010. u 16:00 - pre 170 meseci
Moj problem je sledeci:
Napravio sam aplikaciju koja ucitava slike sa diska, obradjuje ih (resize i crop uglavnom) ON THE FLY i vraca u browser.
To mi sve perfektno radi na mom lokalnom serveru ali kad uploadujem na host prijavljuje "Generic GDI+ error".
Pokusavao sam sve i svasta, ali ne mogu nikako da reprodukujem gresku na lokalnoj masini.
Mislio sam da je problem u security ali u folderu gde su mi slike mogu da preko aplikaciju uploadujem fajlove bez problema, tako da pisanje po folderu nije problem.

Demo projekat (source) u kome koristim identicnu metodu za obradu i vracanje slika je na www.magneti.rs/DynamicImageTest.zip

Ako je neko imao slican problem, molio bih ga za pomoc posto otprilike vise nemam ideja kako ovo da resim.. :(

Unapred se zahvaljujem
DEJ@N
 
Odgovor na temu

ravni

Član broj: 8894
Poruke: 373



+15 Profil

icon Re: Obrada slika (on the fly) u asp.net02.05.2010. u 10:37 - pre 170 meseci
sto se tice security-ja, probaj da upises, iz koda, neki tekst fajl u taj direktorijum. tako ces znati na cemu si
a generic error bi mogao biti do stream-a
kako ucitavas sliku? ako je iz stream-a, onda taj stream ne smes dispose-ovati dok god ne dispose-ujes bitmapu
 
Odgovor na temu

sulja
Dejan Stojanovic
Pozarevac

Član broj: 1140
Poruke: 91
*.dynamic.isp.telekom.rs.

Sajt: www.anthill.co.rs


Profil

icon Re: Obrada slika (on the fly) u asp.net02.05.2010. u 12:33 - pre 170 meseci
Nemam problema da sacuvam fajl tj. sliku koju uploadujem u folder odakle ucitavam sliku tako da neverujem da je security problem sto se tice pisanja po folderu gde cuvam uploadovane slike.
Code (csharp):

 #region Methods
        private Bitmap ResizeByHeight(Bitmap p_Bitmap, int p_Height)
        {
            Bitmap _ResultBitmap;
            Graphics _Graphic;
            int _ResultWidth;
            double _Ration;

            _Ration = ((double)p_Height / (double)p_Bitmap.Height) * (double)100;

            _ResultWidth = (int)Math.Round(p_Bitmap.Width * (_Ration / 100));

            _ResultBitmap = new Bitmap(_ResultWidth, p_Height);
            _Graphic = Graphics.FromImage((System.Drawing.Image)_ResultBitmap);

            _Graphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;

            _Graphic.DrawImage(p_Bitmap, 0, 0, _ResultWidth, p_Height);
            _Graphic.Dispose();
            GC.Collect();
            return _ResultBitmap;
        }
        #endregion

        protected void Page_Load(object sender, EventArgs e)
        {

            Bitmap _Bitmap;
            String _ImagePath;
            System.IO.MemoryStream _MemStream;

                _ImagePath = System.IO.Path.Combine(Server.MapPath("."), "Images");
                _ImagePath = System.IO.Path.Combine(_ImagePath, "Desert.jpg");

                _Bitmap = new Bitmap(_ImagePath);
                _MemStream = new System.IO.MemoryStream();
                _Bitmap.Save(_MemStream, System.Drawing.Imaging.ImageFormat.Jpeg);
                _Bitmap.Dispose();
                _Bitmap = new Bitmap(_MemStream);
                _Bitmap = this.ResizeByHeight(_Bitmap, 300);

                Response.ClearHeaders();
                Response.ClearContent();
                Response.Clear();
                Response.ContentType = "image/Jpeg";
               
                //Response.Output.Close();
                _Bitmap.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
                Response.OutputStream.Close();
                _Bitmap.Dispose();
               


        }
 


Ovo je kod kojim ucitavam sliku, uradim resize i vratim je.
Da podsetim, ovo savrseno radi na mom lokalnom IIS serveru ali kad uploadujem dobijem gresku, sto po nekoj mojoj logici znaci da lepo ucitavam sliku i pisem po streamu.


[Ovu poruku je menjao mmix dana 04.05.2010. u 20:58 GMT+1]
DEJ@N
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Obrada slika (on the fly) u asp.net02.05.2010. u 20:03 - pre 170 meseci
Oddmah da ti kazem nevezano za temu da izbacis GC.Collect(), to nije kolekcija samo tvog pointera to je kolekcija memorije za ceo wroker proces (svih threadova i sessija). Kad si uradio dispose() dealocirao si sistemske resurse, pusti GC da sam resi kad ce da pokupi ostalo
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

sulja
Dejan Stojanovic
Pozarevac

Član broj: 1140
Poruke: 91
*.evizo.net.

Sajt: www.anthill.co.rs


Profil

icon Re: Obrada slika (on the fly) u asp.net02.05.2010. u 20:30 - pre 170 meseci
Hvala na savetu.
Ubicno nikad ne koristim GC ali sam ovde probao sve i svasta samo da nadjem u cemu je problem
DEJ@N
 
Odgovor na temu

ravni

Član broj: 8894
Poruke: 373



+15 Profil

icon Re: Obrada slika (on the fly) u asp.net04.05.2010. u 19:27 - pre 169 meseci
probaj da maknes taj gc.collect kao i sve dispose() pozive pa javi da li puca
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Obrada slika (on the fly) u asp.net04.05.2010. u 19:55 - pre 169 meseci
Nemoj da izbacujes dispose(), samo ces bez potrebe stresovati memoriju alociranim bitmapama. Sta vise, kad vec radis u C# iskoristi using konstrukciju posto ona sama poziva Dispose na izlazu.


POcetna tacka ti je da otkrijes u kojoj liniji ti puca sa generic gdi+, jednostavno ukljuci debug na serveru i iskljuci remoteerror i dobices exception u browseru. POsle mozemo da vidimo dalje, obicno kad nesto radi u localu a ne radi na serveru to je ili neki threading ili security. Moj bet je na new Bitmap(_ImagePath) i threading dva requesta u isto vreme prvi otvori fajl, drugi natrci na file lock.





Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

ravni

Član broj: 8894
Poruke: 373



+15 Profil

icon Re: Obrada slika (on the fly) u asp.net05.05.2010. u 22:12 - pre 169 meseci
a ja bih se kladio da je neka brlja sa dispose-ovima
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.mbb.telenor.rs.



+395 Profil

icon Re: Obrada slika (on the fly) u asp.net05.05.2010. u 22:31 - pre 169 meseci
Lakse je bilo da je guglao nego gledao u pasulj :D
Dodatni msdn info :
http://support.microsoft.com/Default.aspx?id=814675



Viva lollapalooza
 
Odgovor na temu

sulja
Dejan Stojanovic
Pozarevac

Član broj: 1140
Poruke: 91
*.evizo.net.

Sajt: www.anthill.co.rs


Profil

icon Re: Obrada slika (on the fly) u asp.net06.05.2010. u 19:51 - pre 169 meseci
Ta ideja sa pasuljem mi se svidja, posto nista od ovoga ne pomaze :)

Probao sam sa obe metode pomenute u ovom MSDN artiklu, ali i dalje nista ne pomaze.
Lokalno radi perfektno ali na serveru ista prica.
Videcu da jos malo izmaltretiram tehnicku podrsku na hostu, pa da probam jos nesto da izvucem od njih.

U svakom slucaju hvala na postu, jos jedna stvar koja je mogla da bude problem, ali na zalost nije :(
DEJ@N
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Obrada slika (on the fly) u asp.net06.05.2010. u 21:00 - pre 169 meseci
Ja sam i dalje ubedjen da je concurrency problem.

napravi singleton klasu npr:

Code (csharp):

public class WorkerLock
{
   private static WorkerLock _instance = new WorkerLock();
   public static WorkerLock instance { get { return _instance; }}
   private WorkerLock() { }
}


onda sav kod u Page_load ubaci u lock(WorkerLock.instance). To ce ti ubiti konkurentnost stranice na serveru (samo jedan request at the time) ali ako se vise ne javi GenercGDI+ onda ti je to bio problem. Ako je to reci, pa da ti ponudim optimalnije resenje od ovog dijagnostickog.

PS: Tokom ove dijagnostike, u podesavanjima za asp.net aplikaciju u IIS iskljuci worker process recycling, ako digne novi worker proces opet ces uleteti u file lock.
Edit: kucao sam iz glave pa sam zaboravio static.

[Ovu poruku je menjao mmix dana 07.05.2010. u 00:25 GMT+1]
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-a-3.sezampro.rs.



+395 Profil

icon Re: Obrada slika (on the fly) u asp.net07.05.2010. u 08:54 - pre 169 meseci
@sulja
Polako , ima vremena jos za pasulj, nisi istrosio sve opcije :D
Ako ne mozes da uradis remote -debug na serveru sto ne probas trace opciju .
http://www.beansoftware.com/AS...Tutorials/Tracing-ASP.NET.aspx
stavis pageout = true da ti ispise log poruke na dnu ekrana .

Otprilike ovako :
Code (csharp):

protected  void  Page_Load(object sender, EventArgs e)
{

      Bitmap _Bitmap;
      String _ImagePath;
      System.IO.MemoryStream _MemStream;

      _ImagePath = System.IO.Path.Combine(Server.MapPath("."), "Images");
      _ImagePath = System.IO.Path.Combine(_ImagePath, "Desert.jpg");

        System.Diagnostics.Trace.Write("Creating bitmap from file : " + _ImagePath);

      _Bitmap = new Bitmap(_ImagePath);
      _MemStream = new System.IO.MemoryStream();

       System.Diagnostics.Trace.Write("Saving to memory stream!");

      _Bitmap.Save(_MemStream, System.Drawing.Imaging.ImageFormat.Jpeg);
     
      _Bitmap.Dispose();
      _Bitmap = new Bitmap(_MemStream);
       
      System.Diagnostics.Trace.Write("Resizing image .. ");
     
     _Bitmap = this.ResizeByHeight(_Bitmap, 300);

      Response.ClearHeaders();
      Response.ClearContent();
      Response.Clear();
      Response.ContentType = "image/Jpeg";
               
      //Response.Output.Close();
       System.Diagnostics.Trace.Write("Saving to output stream  .. ");
     
      _Bitmap.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
      Response.OutputStream.Close();
      _Bitmap.Dispose();
               
}
 
 

Onda mozes da odredis na osnovu trace-a gde je puklo i lokalizujes bug .
Ako puca pri svakom requestu na nekom razlicitom mestu , onda je sigurno concurrency problem kao sto ti je mmix rekao .

Mozes takodje da izbacis metodu za resize , pa da vratis istu sliku cisto da vidis da li ce da prodje ,
ili iskomentarises ovaj zadnji Save-a u Response.OutputStream.
Isprobaj ove kombinacije pa javi za dalje , ali i meni se cini da je concurency problem cim ti na localhostu radi .
Ako jeste probaj ovu liniju koda da izbacis
Code (csharp):

_Bitmap = new Bitmap(_ImagePath);
 

pa umesto toga probaj da bitmapu ucitavas iz filestream-a koji je otvoren sa FileShare.Read flagom .

[mod: formating]

[Ovu poruku je menjao mmix dana 07.05.2010. u 10:07 GMT+1]
Viva lollapalooza
 
Odgovor na temu

sulja
Dejan Stojanovic
Pozarevac

Član broj: 1140
Poruke: 91
*.evizo.net.

Sajt: www.anthill.co.rs


Profil

icon Re: Obrada slika (on the fly) u asp.net08.05.2010. u 11:54 - pre 169 meseci
Probao sam i sa ucitavanjem iz FileStream-a, ali nije ni to.
Poslao sam zahtev tehnickoj podrsci da mi omoguce error details.

Probacu da vidim tacno liniju gde puca, ali koliko se secam pucalo je pri pisanju u Response.OutputStream i samo na tom mestu, tako da cisto sumnjam da je problem sa concurrency.



DEJ@N
 
Odgovor na temu

ravni

Član broj: 8894
Poruke: 373



+15 Profil

icon Re: Obrada slika (on the fly) u asp.net08.05.2010. u 13:20 - pre 169 meseci
makni sve dispose pozive samo za probu. nista te ne kosta
 
Odgovor na temu

sulja
Dejan Stojanovic
Pozarevac

Član broj: 1140
Poruke: 91
*.evizo.net.

Sajt: www.anthill.co.rs


Profil

icon Re: Obrada slika (on the fly) u asp.net09.05.2010. u 11:58 - pre 169 meseci
I posle mnogo muka konacno sam pronasao debilnu stvar koja me je zezala.
Problem je ako je format slike koju cuvam u output stream PNG, ako stavim da je JPEG sve radi kako treba.

Ne Radi:
Code:
_Bitmap.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Png);


Radi:
Code:
_Bitmap.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);


Bilo bi super da i dalje vracam PNG slike, ali za sad ce JPEG da zavrsi posao dok ne provalim kako da osposobim PNG format u output streamu.
DEJ@N
 
Odgovor na temu

[es] :: .NET :: ASP.NET :: Obrada slika (on the fly) u asp.net

[ Pregleda: 2345 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.