Ik ben bezig een applicatietje te schrijven die grote afbeeldingen moet kunnen weergeven (megapixel-afmetingen zegmaar). Het laden van een afbeelding, een simpele JPEG, duurt hierbij al gauw 2-3 seconden, zelfs op mijn dikke quadcore. Wat ik dus wil, is een voortgang maken dat nog veel harder nodig is voor mensen met een niet-zo-snelle cpu. Let overigens wel dat ik zoek naar voortgang van het decoden, niet het laden van disk.
Mijn ultieme doel is dat ik een image al ladend in een picturebox "langzaam" zie opbouwen, net zoals een browser dat ook zo mooi kan met grote jpegs. Daarnaast wil ik het laden vaneen afbeelding kunnen cancellen, zodat als de gebruiker door een lijst met afbeelding bladert, hij niet voor iedere stap moet wachten.
Ik hoopte dus dat je aan Image.Load() een callback of iets kan meegeven, maar helaas. GDI+ lijkt zoiets nergens te ondersteunen.
Wat heb ik al geprobeerd:
Ik heb een Stream class geschreven die om een FileStream heen wrapt, en een event afvuurt bij iedere call naar Stream.Read(). Zo kan ik in dit event een exception opgooien om het laden af te breken. Helaas heeft dit twee grote nadelen: je kunt de te laden afbeelding nog steeds niet progressief weergeven, en je moet je in rare bochten wringen omdat GDI+ er niet zo blij mee is
Wat ga ik niet proberen (denk ik
):
PictureBox.LoadAsync(). Die gaat het niet worden voor mij, omdat het async-gedeelte ervan niet meer is dan het laden van disk (of internet). En dus gaat het decoden nog steeds synchroon. Bovendien zal het alleen met een picturebox werken, en ik heb meer flexibiliteit nodig.
Heeft iemand een idee hoe ik dit kan bereiken? Het zou een beetje zuur zijn als iets basaals als een progress-callback niet mogelijk is, toch?...
Mijn ultieme doel is dat ik een image al ladend in een picturebox "langzaam" zie opbouwen, net zoals een browser dat ook zo mooi kan met grote jpegs. Daarnaast wil ik het laden vaneen afbeelding kunnen cancellen, zodat als de gebruiker door een lijst met afbeelding bladert, hij niet voor iedere stap moet wachten.
Ik hoopte dus dat je aan Image.Load() een callback of iets kan meegeven, maar helaas. GDI+ lijkt zoiets nergens te ondersteunen.
Wat heb ik al geprobeerd:
Ik heb een Stream class geschreven die om een FileStream heen wrapt, en een event afvuurt bij iedere call naar Stream.Read(). Zo kan ik in dit event een exception opgooien om het laden af te breken. Helaas heeft dit twee grote nadelen: je kunt de te laden afbeelding nog steeds niet progressief weergeven, en je moet je in rare bochten wringen omdat GDI+ er niet zo blij mee is
Wat ga ik niet proberen (denk ik
PictureBox.LoadAsync(). Die gaat het niet worden voor mij, omdat het async-gedeelte ervan niet meer is dan het laden van disk (of internet). En dus gaat het decoden nog steeds synchroon. Bovendien zal het alleen met een picturebox werken, en ik heb meer flexibiliteit nodig.
Heeft iemand een idee hoe ik dit kan bereiken? Het zou een beetje zuur zijn als iets basaals als een progress-callback niet mogelijk is, toch?...
日本!🎌