Aktuelle Zeit: 23.05.2013 08:45

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 22 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: SaveImageToMemory() [Windows-Only]
BeitragVerfasst: 14.04.2009 20:13 
Offline
Benutzeravatar

Registriert: 26.06.2008 10:42
Nachdem ich eine Featurerequest im englishen Forum gemacht hab, Bilder direkt in den Speicher zu sichern, hat mir srod einen Tip gegeben, den ich nun zu einer Procedure verwurstet hab:

http://www.purebasic.fr/english/viewtop ... 247#283247

Code:
Procedure SaveImageToMemory(Image, *MemSize, Format = #PB_ImagePlugin_BMP, Compression = 7)
  Protected *Mem, MemSize, ImageDataPipe
  MemSize = ImageDepth(Image)*ImageHeight(Image)*ImageWidth(Image)
  *Mem = AllocateMemory(MemSize)
  ImageDataPipe = CreateNamedPipe_("\\.\pipe\ImageDataPipe", #PIPE_ACCESS_INBOUND | #FILE_FLAG_OVERLAPPED, #PIPE_TYPE_BYTE | #PIPE_READMODE_BYTE | #PIPE_NOWAIT, 1, MemSize, MemSize, #NMPWAIT_USE_DEFAULT_WAIT, #Null)
  SaveImage(Image, "\\.\pipe\ImageDataPipe", Format, Compression)
  ReadFile_(ImageDataPipe, *Mem, MemSize, *MemSize, #Null)
  CloseHandle_(ImageDataPipe)
  ProcedureReturn *Mem
EndProcedure


Ich brauch sowas immer wieder, ganz nützlich.

_________________
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86


Zuletzt geändert von cxAlex am 15.04.2009 16:42, insgesamt 1-mal geändert.

Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 15.04.2009 00:32 
Offline

Registriert: 10.09.2004 20:51
Wohnort: Ansbach
Klasse :allright:
Lass mich raten, das ganze läuft auch in deinem DesktopStreamer^^

_________________
(\/) (°,,,°) (\/)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 15.04.2009 06:35 
Offline
Benutzeravatar

Registriert: 26.06.2008 10:42
KeyKon hat geschrieben:
Klasse :allright:
Lass mich raten, das ganze läuft auch in deinem DesktopStreamer^^


exakt, in der nächsten Version ists drin ^^

_________________
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 15.04.2009 11:34 
Offline

Registriert: 10.09.2004 20:51
Wohnort: Ansbach
Btw, ich bin zwar kein Englisch-Guru, aber ich meine der Topic müsste SaveImageToMemory() heißen ;-)

_________________
(\/) (°,,,°) (\/)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 15.04.2009 11:47 
Offline
Benutzeravatar

Registriert: 29.08.2004 08:37
Hmm... das müsste so ähnlich sicher auch unter Linux gehen.

_________________
Mit freundlichen Grüßen,
Daniel http://www.bradan.eu/
Bild
Ich bearbeite meine Postings häufig, kurz nachdem ich sie abgeschickt habe. - Windows 7 64bit, PureBasic: Die aktuelle Version
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 15.04.2009 16:29 
Offline
Moderator

Registriert: 15.06.2008 18:22
KeyKon hat geschrieben:
Btw, ich bin zwar kein Englisch-Guru, aber ich meine der Topic müsste SaveImageToMemory() heißen ;-)

Nur der Threadtitel ist falsch (meiner Meinung nach), die Procedure an sich ist richtig.

_________________
Win8 x64 | PB 5.10


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 15.04.2009 16:43 
Offline
Benutzeravatar

Registriert: 26.06.2008 10:42
Jo mein Fehler :oops:.

Beim Programmieren kam mir PB mit der Autovervollständigung entgegen, im Titel hat sich mein schlechtes Englisch durchgesetzt :mrgreen: .

_________________
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 15.04.2009 18:11 
Offline
Moderator

Registriert: 15.06.2008 18:22
allgemein zur Procedure :allright:


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 25.04.2009 00:17 
Offline
Benutzeravatar

Registriert: 26.06.2008 10:42
Update:

Das ganze ist nun Thread-Safe, bei massiver verwendung in Threads konnte es zu Kollisionen mit der Pipe kommen:

Code:
Procedure SaveImageToMemory(Image, *MemSize, Format = #PB_ImagePlugin_JPEG, Compression = 9)
  Protected *Mem, MemSize, ImageDataPipe, PipeName$
  PipeName$ = "\\.\pipe\ImageDataPipe_" + Str(GetCurrentThreadId_()) ; <- Threadsicher
  MemSize = ImageDepth(Image)*ImageHeight(Image)*ImageWidth(Image)
  *Mem = AllocateMemory(MemSize)
  ImageDataPipe = CreateNamedPipe_(PipeName$, #PIPE_ACCESS_INBOUND | #FILE_FLAG_OVERLAPPED, #PIPE_TYPE_BYTE | #PIPE_READMODE_BYTE | #PIPE_NOWAIT, 1, MemSize, MemSize, #NMPWAIT_USE_DEFAULT_WAIT, #Null)
  SaveImage(Image, PipeName$, Format, Compression)
  ReadFile_(ImageDataPipe, *Mem, MemSize, *MemSize, #Null)
  CloseHandle_(ImageDataPipe)
  ProcedureReturn *Mem
EndProcedure

_________________
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 25.04.2009 22:04 
Offline
Benutzeravatar

Registriert: 14.06.2005 15:53
Wohnort: Berlin, Kreuzberg
Hi cxAlex,

der Code sieht gut aus. Wie genau wende ich Ihn den Code praktisch an? Ich weis nicht wie ich den Wert "*MemSize" ermitteln muss den ich der Prozedur übergebe. Wenn ich meine Code durch Deinen ersetze kommt immer eine Fehlermeldung in der folgender Zeile:

> ReadFile_(ImageDataPipe, *Mem, MemSize, *MemSize, #Null) > invalid memory access

Mein Code zur Übergabe eines Image in einen Speicherbereich:

Code:

 w = ImageWidth(Img)
  h = ImageHeight(Img)
  hBmp = ImageID(Img)
 
  bmi\bmiHeader\biSize        = SizeOf(BITMAPINFOHEADER)
  bmi\bmiHeader\biWidth       =  w

  If direction = 0
     bmi\bmiHeader\biHeight      =  h ; -h dreht das Bild als Textur
  Else
     bmi\bmiHeader\biHeight      =  -h
  EndIf

  bmi\bmiHeader\biPlanes      =  1
  bmi\bmiHeader\biBitCount    = 32
  bmi\bmiHeader\biCompression = #BI_RGB
 

  width = w
  height = h

  bitcount = 32 ; Should be 24 bits for this example
  ; Rows need to be a multiple of 4 bytes so calculate extra bytes needed
  extrabytesperrow = (4 - (width * bitcount / 8) % 4) % 4

  ; Allocate memory for bitmap
  sizeheaders = SizeOf(BITMAPFILEHEADER) + SizeOf(BITMAPINFOHEADER)
  sizeimage = (width * bitcount / 8 + extrabytesperrow) * height

  *bitmap = AllocateMemory(sizeheaders + sizeimage)

  If *bitmap = 0
    ProcedureReturn #False
    ;Debug("Couldn't allocate memory for bitmap")
    ;End
  EndIf

  ; Set bitmap headers
  *bitmapfile.BITMAPFILEHEADER = *bitmap
  *bitmapfile\bfType = Asc("B") + Asc("M") << 8
  *bitmapfile\bfSize = sizeheaders +sizeall
  *bitmapfile\bfOffBits = sizeheaders

  *bitmapinfo.BITMAPINFOHEADER = *bitmap + SizeOf(BITMAPFILEHEADER)
  *bitmapinfo\biSize = SizeOf(BITMAPINFOHEADER)
  *bitmapinfo\biWidth = width
  *bitmapinfo\biHeight = height
  *bitmapinfo\biPlanes = 1
  *bitmapinfo\biBitCount = bitcount
  *bitmapinfo\biCompression = 0
  *bitmapinfo\biSizeImage = sizeimage

  *bitmapdata = *bitmap + sizeheaders

; Create 24 bit image in bitmap
  *bitmapdatapos = *bitmapdata


  hDC  = StartDrawing( ImageOutput(Img) )
  If GetDIBits_(hDC, hBmp, 0, h, *bitmapdatapos , bmi, #DIB_RGB_COLORS)
     StopDrawing()
  Else
     StopDrawing() 
  EndIf

_________________
Working on - MP3D Engine -


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 22 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye