Problem mit Plattformunabhängigkeit mit wx.BitmapFromImage
Verfasst: Donnerstag 7. Oktober 2010, 15:00
Hallo Zusammen,
ich bin relativ neu hier und auch was GUI Programmierung angeht aber ich bin bei meinem derzeitigen Projekt über etwas gestolpert wo ich nicht mehr weiter komme:
Ich bin dabei eine Echtzeitdarstellung eines Audiosignals (mittels pyaudio) zu implementieren. Was ich machen wollte funktioniert auch alles Prima.... jedoch leider nur unter OSX und Windows! Auf meiner Ubuntu Kiste funktioniert es zwar auch aber das Bild schaut total "pixlig" aus.
Hier ist was ich mache.... ich habe ein Frame von fixer Größe
Und ein Panel welches ich mittels dem timer im frame refreshed (==paint event) wird
Und ein Objekt welches sich selber zeichnet (dies beinhaltet ein wx.Image welches ich manipuliere und dann auf den dc zeichnen lasse)... soweit nix neues! Ich will euch nicht langweilen
Es soll ein Bild darstellen das von rechts nach link über den Bildschirm läuft (und wie gesagt das tut es auch einwandfrei unter Windows und OSX....). Mahle ich direkt auf den dc mit:
Funktioniert das auf allen Plattformen... aber:
Eben nicht?!? Ich will aber nicht immer das ganze Bild neu berrechnen da dann alles anfängt zu ruckeln und ich gedacht hab das ich es in einem wx.Image halte und dann den neuen Teil hinten dran hänge und eben mit:
Die Verschiebung erziele (war auch richtig gedacht... aber eben nicht unter Linux (unter SuSe hab ich das gleiche Problem...))
Hat einer von euch eine Idee????? Ich komm einfach nicht weiter!
1000 Dank schon mal
ich bin relativ neu hier und auch was GUI Programmierung angeht aber ich bin bei meinem derzeitigen Projekt über etwas gestolpert wo ich nicht mehr weiter komme:
Ich bin dabei eine Echtzeitdarstellung eines Audiosignals (mittels pyaudio) zu implementieren. Was ich machen wollte funktioniert auch alles Prima.... jedoch leider nur unter OSX und Windows! Auf meiner Ubuntu Kiste funktioniert es zwar auch aber das Bild schaut total "pixlig" aus.
Hier ist was ich mache.... ich habe ein Frame von fixer Größe
Code: Alles auswählen
class RealTimeSonarFrame(wx.Frame):
def __init__(self, parent, id, title):
...
self.panel = SonarPanel(self,self.config)
self.timer = wx.Timer(self)
self.SetMinSize((900, 200))
self.SetMaxSize((900, 200))
self.timer.Start(50)
...
def on_timer(self, event):
self.panel.update_drawing()
Code: Alles auswählen
class SonarPanel(wx.Window):
def __init__(self, parent, config):
...
self.Bind(wx.EVT_PAINT, self.on_paint)
...
def update_drawing(self):
self.Refresh(False)
def on_paint(self, event):
dc = wx.AutoBufferedPaintDC(self)
dc.Clear()
width, height = self.GetClientSize()
self.mySonar.draw(dc)

Code: Alles auswählen
class Sonargram(object):
def __init__(self, size, config):
...
self.myIMG = wx.EmptyImage(self.size.x,self.size.y)
...
def draw(self,dc):
newImg = self.myIMG.GetSubImage(wx.Rect(self.oldFFTlen, 0, self.size.x-self.oldFFTlen, self.size.y))
self.myIMG.Paste(newImg,0,0)
for i in range(0,len(self.fftData)):
for j in range(0,self.size.y):
ampl = self.fftData[i][self.size.y-j]
invAmpl = 255-ampl
if invAmpl < 0 or invAmpl > 255:
self.myIMG.SetRGB(self.size.x-len(self.fftData)+i,j,0,0,0)
else:
if self.config.color == 'red':
print 'sdfs'
self.myIMG.SetRGB(self.size.x-len(self.fftData)+i,j,invAmpl,0,0)
elif self.config.color == 'green':
self.myIMG.SetRGB(self.size.x-len(self.fftData)+i,j,0,invAmpl,0)
elif self.config.color == 'blue':
self.myIMG.SetRGB(self.size.x-len(self.fftData)+i,j,0, 0, invAmpl)
elif self.config.color == 'gray':
self.myIMG.SetRGB(self.size.x-len(self.fftData)+i,j,invAmpl,invAmpl,invAmpl)
dc.DrawBitmap(wx.BitmapFromImage(self.myIMG),0,0)
self.oldFFTlen = len(self.fftData)
self.fftData = []
Code: Alles auswählen
dc.SetPen(wx.Pen(wx.Color(invAmpl,0,0),2))
dc.DrawPoint(self.size.x-len(self.fftData)+i,j)
Code: Alles auswählen
dc.DrawBitmap(wx.BitmapFromImage(self.myIMG),0,0)
Code: Alles auswählen
newImg = self.myIMG.GetSubImage(wx.Rect(self.oldFFTlen, 0, self.size.x-self.oldFFTlen, self.size.y))
self.myIMG.Paste(newImg,0,0)
Hat einer von euch eine Idee????? Ich komm einfach nicht weiter!
1000 Dank schon mal