Hirmu läjä kuvia pitäisi saada pienennettyä. Koodi kyllä toimii, mutta aina jossain kohtaa tulee ilmoitus Out of memory. Mikäpä neuvoksi?
Testissä on noin 300 kpl 10 megapikselin kuvaa hakemistossa C:\tmp, pikkukuvat pitäisi saada hakemistoon C:\tmp\pikkukuvat\ (Ja Irfanview yms ei nyt tule kysymykseen :-)
VB:ssä formille kaksi pictureboxia ja button, sekä alla oleva koodi
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim a As String Dim Hakemisto As String = "C:\tmp\" Dim PikkukuvaHakemisto As String = "C:\tmp\pikkukuvat\" a = Dir(Hakemisto + "*.jpg") Do Until a = "" If Microsoft.VisualBasic.Left(a, 2) <> "t_" Then Dim fileExists As Boolean fileExists = My.Computer.FileSystem.FileExists(PikkukuvaHakemisto + "t_" + a) If fileExists = False Then PictureBox1.Image = Image.FromFile(Hakemisto + a) ResizeKuva(400, 300) PictureBox2.Image.Save(PikkukuvaHakemisto + "t_" + a, System.Drawing.Imaging.ImageFormat.Jpeg) PictureBox2.Refresh() End If End If a = Dir() Loop End Sub Private Sub ResizeKuva(ByVal _leveys As Integer, ByVal _korkeus As Integer) ' Resize the image. Dim sourceBitmap As New Bitmap(PictureBox1.Image) Dim destBitmap As New Bitmap(_leveys, _korkeus) Dim destGraphic As Graphics = Graphics.FromImage(destBitmap) destGraphic.DrawImage(sourceBitmap, 0, 0, destBitmap.Width + 1, destBitmap.Height + 1) PictureBox2.Image = destBitmap End Sub
Mitäs jos sanoisit tuolla resizekuva lopussa destGraphic.Dispose(), destBitmap.Dispose() ja sourceBitmap.Dispose()
Kyllähän tuo pitäisi tapahtua automaattisestikin kun menee pois näkyvyysalueelta, mutta siltä varalta että se vapauttelee niitä viiveellä niin tuota voisi kokeilla. En siis takaa että auttaa mitenkään.
Olen kokeillut sitäkin, mutta eipä auta sekään. Myöskään samoihin kohtiin destGraphic = Nothing ja vastaavat ei auta.
Heippa AimoKulaus!
laittaisin ton napin koodin hieman eri muotoon...
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim Hakemisto As New System.IO.DirectoryInfo("C:\temp\") Dim filut() As System.IO.FileInfo = Hakemisto.GetFiles("*.jpg") Dim PikkukuvaHakemisto As String = "C:\tmp\pikkukuvat\" If filut.length > 0 Then For i As Integer = 0 To filut.GetUpperBound(0) If filut(i).ToString.IndexOf("t_") <> 0 Then If Dir(PikkukuvaHakemisto + _ "t_" + filut(i).ToString) = "" Then PictureBox1.Image = _ Image.FromFile(Hakemisto + filut(i).ToString) ResizeKuva(400, 300) PictureBox2.Refresh() Try PictureBox2.Image.Save(PikkukuvaHakemisto + _ "t_" + filut(i).ToString, _ System.Drawing.Imaging.ImageFormat.Jpeg) Do While Dir(PikkukuvaHakemisto + _ "t_" + filut(i).ToString) = "" Application.DoEvents Loop Catch ex As Exception End Try End If End If Next End If Hakemisto = Nothing: filut = Nothing PikkukuvaHakemisto = Nothing End Sub
Sorry AimoKulaus!
jäi muuttamatta toi prompti string-muotoon...
...
Image.FromFile(Hakemisto.ToString + ...
Tutkailin alkuperäistä ohjelmaa Tehtävienhallinnan avulla. Muistin käyttö muistutti ohjelmoijan sydänkäyrää, eli välillä käyrä nousi ylöspäin, kunnes putosi taas alas, nousi ylös, putosi alas jne, eli sahanterää. Näin kai sen pitääkin mennä, eli ohjelma varailee muistia, kunnes se loppuu, tekee sitten roskien keruun eli Garbage collectionin ja jatkaa taas. Jostain syystä tuo ei aina toimi, ja ohjelma pysähtyi virheeseen. (Siis Microsoftin vika ;-)
Homman saa näköjään onnistumaan kun pakottaa Garbage collectionin joka kuvan jälkeen, eli alkuperäiseen ohjelmakoodiin lisäys tuon Dirrin eteen:
GC.Collect() a = Dir()
Tämä kai hidastaa ohjelman toimintaa, mutta parempi sekin kuin ei toimintaa ollenkaan. (Tosin en ole ihan varma tuon Garbage collectionin toiminnasta kaikkine sukupolvineen ja generationeineen...)
Heippa taas AimoKulaus!
tutki piruuttas mitä tapahtuu joka kerta kun painat nappia...
'... Dim a As String = Dir(Hakemisto + "*.jpg") MsgBox(a) 'tsekkaa tällä '...
Tää on helppo: Joka kerran tulee sama tiedosto. Siksipä seuraavan kerran pitää olla "tyhjä" Dir. Alkuperäisessäkin ohjelmassa on tämä rakenne
Dim hakemisto As String = "C:\tmp\" Dim a As String a= Dir(Hakemisto + "*.jpg") Do Until a = "" MsgBox(a) 'tsekkaa tällä a = Dir() Loop
Dirrillä tiedostot tulevat epämääräisessä järjestyksessä, luultavasti luontijärjestyksessä. Tosin tällä ei nyt ole tässä tapauksessa väliä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.