Toon posts:

[VB/Win32] Bmp --> jpeg in DC

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zal eerst even uitleggen wat de situatie is:

Ik ben bezig met het maken van een VNC-achtig programma in VB, aan de serverkant zal ik dus een X-aantal keer per seconde een 'screenshot' moeten nemen dmv de API functie BitBlt. Doordat dit programma ook zal moeten werken op een langzame computer, en de framerate een beetje acceptabel zal moeten blijven is het niet mogelijk om gebruik te maken van een picturebox of zelfs om het .bmp bestand op te slaan op de hardeschijf.
De oplossing waar ik dus voor gekozen heb is om het plaatje in DC (Direct Context) te plaatsen, tot hier gaat het allemaal prima. Nu komt mijn probleem: het omzetten van het (bmp) plaatje naar een meer acceptabel formaat zoals jpeg, waar ik bij voorkeur ook nog de kwaliteit kan bepalen, en het tweede probleem is hoe ik de DC uit kan lezen en kan versturen.
Het probleem is niet het vinden van code of een dll die bmp naar jpeg converteert, het probleem is dat bijna al deze programma's het plaatje niet uit een DC kunnen halen, en het schrijven/lezen van en naar de hardeschijf het programma te langzaam zou maken.

Dus als iemand ideeen heeft, suggesties, of denkt van dat kan je veel beter zo oplossen: DC is onzin en dit is veel sneller dan hoor ik het graag!

  • The End
  • Registratie: Maart 2000
  • Laatst online: 08-05 20:49

The End

!Beginning

Ik kan je nu al vertellen dat je programma extreem traag wordt als je meerdere keren per seconde een screenshot neemt en die converteert naar jpeg. Zelfs op een goed snelle machine is dit niet werkbaar; vooral als je die plaatjes ook nog gaat versturen naar een andere PC.

Als je een plaatje wil capturen dan kan ik je deze link aanraden:
http://www.codeguru.com/C...turing/article.php/c4919/

Als je een screenshot neemt dan krijg je een DDB (Device Dependant Bitmap); Die moet je eerst converteren naar een DIB (Device independant Bitmap), vanaf daar kan je hem met de jpeg library converteren naar een jpeg.

edit:


Oops! Het is natuurlijk VB en niet C++ :) Foutje...

[ Voor 6% gewijzigd door The End op 14-04-2005 16:32 ]


Verwijderd

Topicstarter
The End schreef op donderdag 14 april 2005 @ 16:30:
Ik kan je nu al vertellen dat je programma extreem traag wordt als je meerdere keren per seconde een screenshot neemt en die converteert naar jpeg. Zelfs op een goed snelle machine is dit niet werkbaar; vooral als je die plaatjes ook nog gaat versturen naar een andere PC.

Als je een plaatje wil capturen dan kan ik je deze link aanraden:
http://www.codeguru.com/C...turing/article.php/c4919/

Als je een screenshot neemt dan krijg je een DDB (Device Dependant Bitmap); Die moet je eerst converteren naar een DIB (Device independant Bitmap), vanaf daar kan je hem met de jpeg library converteren naar een jpeg.

edit:


Oops! Het is natuurlijk VB en niet C++ :) Foutje...

De code die jij geeft gaat niet over mijn probleem, het capturen van het plaatje zelf lukt namelijk prima? Het heeft nogmaals geen zin om het plaatje via je hd te gaan converteren (dus opslaan/laden/opslaan/laden) omdat dat inderdaad te langzaam gaat worden...
Je zegt verder nog dat het programma extreem traag zou worden, hoe word dit opgelost in (commerciele) VNC-servers dan? Die worden weliswaar in andere (snellere) talen gebouwd neem ik aan, maar omdat ik voor dit alles volledig gebruik maak van API zal de snelheid (traagheid) van sommige elementen in VB geen bottleneck zijn?
Ik zie verder ook niet in waarom het verzenden van data een opmerkelijke vertraging tot gevolg kan hebben?

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
JPG is een foto-compressie standaard. Snelheid en compressie van egale vlakken/tekst zijn juist zwakke punten van JPEG. Dat is je grootste probleem.

Ik heb alleen het idee dat je project wat gedoemd is. Je wil meerdere megabytes per seconde processen. Daarvoor is VB niet de meest geeigende taal. Sterker nog, zelfs C++ is al niet ideaal: dit soort klussen is eerder werk voor MMX/SSE. Dat scheelt overigens maar een factor 2 of zo met C++. C++ is wel weer veel sneller dan VB (aantal redenen, maar uiteindelijk is beeldbewerking erg lowlevel.). In dit geval bijvoorbeeld wil je streaming compressie doen, op delen van beeldlijnen. Dat betekent gewoon majeur pointer prutsen.

Ook bij het vervolgens verzenden is VB ben ik bang minder geschikt. Wat je daarvoor nodig hebt is Overlapped I/O, en vanuit VB wil ik niet eens weten hoe dat moet. Die API is niet echt VB-vriendelijk.

Een andere reden waarom C++ sneller is, is dat je vaak met minder kopieen kunt werken. Een heleboel API's zijn wel snel, zolang je geen kopie hoeft te maken van de input. Maak je echter een kopie van 3MB, dan ben je zo miljoenen klokcycli verder. In C++ is een pointer kopietje zo gemaakt, vaak niet meer dan een kokcyclus. (voordeel van const-correctness)

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Overigens lijkt http://msdn.microsoft.com...rectdraw7/ddover_5bnb.asp wel een goede tip. Met een beetje geluk zijn je stride en pixelformaten identiek, dan kun je gewoon een bit copy doen over het netwerk.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 07-05 22:49

curry684

left part of the evil twins

Ik heb zelf ooit een zeer performante remote desktop applicatie in C++ geschreven, geen enkel probleem hoor. Moet je wel de verleiding weerstaan om feitelijk screenshots te gaan versturen en alleen delta's (middels BitBlt in XOR-modus) van veranderde schermdelen te versturen ;)

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 07-05 22:49

curry684

left part of the evil twins

Verwijderd schreef op donderdag 14 april 2005 @ 16:22:
De oplossing waar ik dus voor gekozen heb is om het plaatje in DC (Direct Context) te plaatsen
Een DC is trouwens een Device Context, da's nogal wat anders. Een DC is een abstracte entity in de Windows GDI die de koppeling tussen een Device en grafische data representeert.

Iets zegt me dat je de materie niet genoeg beheerst om een remote desktop app te schrijven. Uberhaupt een benul van wat hooks zijn en met hoe je acties zoals keypresses en muiskliks gaat waarnemen en remote uitvoeren? :)

Professionele website nodig?


  • The End
  • Registratie: Maart 2000
  • Laatst online: 08-05 20:49

The End

!Beginning

Misschien een handige tip. De source code van VNC is vrij beschikbaar; het is welliswaar in C++, maar ik denk dat je uberhaupt voor dit soort apps niet ver komt met VB.

Je kan met de source van VNC een idee krijgen van hoe je zo'n applicatie kan maken.
Pagina: 1