[erledigt] Image "verschieben"

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

[erledigt] Image "verschieben"

Beitrag von scholly »

moin, moin...

Ich bin grade dabei, eine Menge "Font-Images" zu sortieren.
Unter anderem checke ich, ob sie dem OSDM- oder RSIDM-Format entsprechen.
Neben den richtigen Buchstaben an der richtigen Stelle müssen sie z.B. in ein 32er Raster passen, das natürlich links und oben bei 0 beginnt.

Nun habe ich einige Pics gefunden, die scheinen zwar dem Raster zu entsprechen, aber um ein(ige) Pixel verschoben zu sein.

Und schon sind die Bäume wieder da :(

Wie nehme ich in dem Image links/oben am einfachsten ein(ig)e Pixel-Reihe(n)/-Spalte(n) weg ?
Mir spukt da sowas wie "Image nach links/oben Shiften" durch die Gehirnzellen.
Gibts dafür einen PB- oder API-Befehl ?

Ich hoffe, daß Problembeschreibung auch ohne Bild verständlich genug ist um zu einige Tips zu kommen.

mDv... scholly
Zuletzt geändert von scholly am 17.05.2008 15:56, insgesamt 1-mal geändert.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

am einfachsten wäre ein zweites image,
und mittels DrawImage dort das erste drauf"malen",
eben um die betreffende anzahl pixel verschoben.
FreeImage aufs erste danach nich vergessen.

ist nicht das eleganteste, aber wesentlich einfacher, als auf den speicher zuzugreifen und scrollen zu wollen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

Kaeru Gaman hat geschrieben:am einfachsten wäre ein zweites image,
und mittels DrawImage dort das erste drauf"malen",
eben um die betreffende anzahl pixel verschoben.
Hm...
Ich hab ja über das zu "bewegende" Image z.B. ein 32er Raster gelegt.
(XabYs Lösung aus dem Nachbarthread kann ich erst nachher Zuhause in Ruhe begutachten...)

Um nun herauszubekommen, ob ich optisch getäuscht wurde, oder es wirklich nur ein verschobenes "Standard-Font-Image" ist, muß ich das Image in seinem Gadget im Zweifelsfall "unterm Raster" mehrfach hin- und herschieben, um es im günstigsten Fall dann (ohne Raster) neu speichern zu können.
Zum Verschieben schwebt mir so ein TrackBarGadget() vor.
ist nicht das eleganteste, aber wesentlich einfacher, als auf den speicher zuzugreifen und scrollen zu wollen.
Nun, Eleganz im Code ist nicht meine Prämisse, eher Verständlich- und Wiederverstehbarleit.
Ich hatte nur still und heimlich gehofft, jemand würde etwas kennen wie Imageshift(IMG-ID, Richtung, Pixelzahl) ;)
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

hab das gleich mal gecoded :mrgreen:
wie das bei dir mit der hintergrundfarbe ist mußt du sehen. hier wird sie einfach aus pixel 0,0 ausgelesen.

Code: Alles auswählen

Procedure shiftImage(img,x,y)
  If IsImage(img)
    Protected tempimg=CopyImage(img,#PB_Any)
    If IsImage(img2)
      StartDrawing(ImageOutput(img))
        Box(0,0,ImageWidth(img),ImageHeight(img), Point(0,0) ) ; background color is taken from pixel 0,0
        DrawImage(ImageID(tempimg), x,y)
      StopDrawing()
      FreeImage(tempimg)
    EndIf
  EndIf
EndProcedure


CreateImage(0, 100,100)
StartDrawing( ImageOutput(0) )
  Circle(50,50,10,$00ff00)
StopDrawing()

ww=300
wh=300
hWin=OpenWindow(0, 50,50,ww,wh, "")
CreateGadgetList(hWin)
  ImageGadget(0,  0, 0,  0,0, ImageID(0) )
  CopyImage(0,1)
  shiftImage(1,  -20,  0)
  ImageGadget(1,  0, 110,  0,0, ImageID(1) )


Repeat
  event=WaitWindowEvent()
  Select event
    Case #PB_Event_CloseWindow
      quit=1
  EndSelect
Until quit
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

Das find ich so toll hier:
Ich hab keine Ahnung oder seh den Wald vor lauter Bäumen nicht und dann kommt einer aus "tieferDunklerWald. ...nachts" (kann also nicht hier in D sein, denn hier ist strahlend blauer Himmel und Sonnenschen ;) ) und hilft.
#NULL hat geschrieben:hab das gleich mal gecoded :mrgreen:
wie das bei dir mit der hintergrundfarbe ist mußt du sehen. hier wird sie einfach aus pixel 0,0 ausgelesen.
Hintergrund ist lt. dem Standard immer Schwarz und im ersten Kästl is eh kein Buchstabe vorgesehen.

:allright: ... scholly
Zuletzt geändert von scholly am 15.02.2008 23:28, insgesamt 1-mal geändert.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Und nimmst Point()
Um den Farbwert des Bildpunktes zu ermitteln.
Könntest das Ganze damit automatisieren und eine Routine entwickeln, die automatisch Kästchengrößen probiert und schaut, ob Buchstaben abgeschnitten werden oder nicht.

Oder du machst ein OpenWindowedScreen()
und kannst die Buschstaben als Sprites reinzeichnen, dann kannst du mit SpritePixelCollision() testen, wo eine Kollision zum Beispiel mit einem Feld statt findet.

Code: Alles auswählen

;/ Folker Linstedt, xaby 2008-02-15

;/ Hintergrund-Bild
CreateImage(1,320,240)
CreateImage(0,320,240)
StartDrawing(ImageOutput(0))
For i=0 To 239
   Box(0,i,320,1,RGB(255,50 + (205 * i / 239),0))
Next
StopDrawing()

;/ Hier dann dein Font-Image
CreateImage(5,220,40)
StartDrawing(ImageOutput(5))
  Box(0,0,220,40,RGB(128,128,255))
  DrawingMode(#PB_2DDrawing_Transparent)    
  DrawText(20, 20, "H A L L O   F R E U N D E",RGB(255,255,0))
  DrawText(21, 21, "H A L L O   F R E U N D E",RGB(0,0,0))
StopDrawing()


Procedure ZeichneNeu(xBreite,yHoehe,VerschiebX,VerschiebY)
  CopyImage(0,1)
    StartDrawing(ImageOutput(1))
    
    DrawImage(ImageID(5),VerschiebX,VerschiebY)
    
    
    ;/ Grid
      For i=0 To 320 / xBreite
        LineXY(xBreite*i,0,xBreite*i,240,RGB(255,255,255))
      Next
    
      For i=0 To 240 / yHoehe
        LineXY(0,yHoehe*i,320,yHoehe*i,RGB(255,255,255))
      Next    
      

    StopDrawing()
  SetGadgetState(2,ImageID(1))
EndProcedure

OpenWindow(0,0,0,400,350,"Bitmap Grid",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))


ImageGadget(2,0,0,300,300,ImageID(1))

TrackBarGadget(0,10,250,200,40,8,64)
TrackBarGadget(1,340,10,40,200,8,64,#PB_TrackBar_Vertical)

TrackBarGadget(5,0,300,100,40,0,100)
TrackBarGadget(6,300,250,40,80,0,50,#PB_TrackBar_Vertical)

SetGadgetState(0,20)
SetGadgetState(1,20)

ZeichneNeu(20,20,0,0)

Repeat
   EventID = WaitWindowEvent()

   If EventID = #PB_Event_Gadget
      GadgetNr= EventGadget()
      
      ZeichneNeu(GetGadgetState(0),GetGadgetState(1),GetGadgetState(5),GetGadgetState(6))      
      
   EndIf
Until EventID = #PB_Event_CloseWindow
 
Zuletzt geändert von Xaby am 15.02.2008 18:41, insgesamt 1-mal geändert.
Kinder an die Macht http://scratch.mit.edu/
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Xaby hat geschrieben:...SpritePixelCollision()...
jawoll, und ne kanone, die 10 minuten zum laden braucht, um auf spatzen zu schießen...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Ich weiß ja nicht, was er vor hat.

Als er mit Text in einem Raster im anderen Thread angefangen hat, wollte ich ihm schon StringGadget() empfehlen :mrgreen:

Hab mal nach OSDM gesucht. OldSchoolDemoMaker
http://www.pouet.net/prod.php?which=20544

Das ist ein kleines KlickyKlackyProgramm und das Resultat ist immer anschaulich /:->
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

Xaby hat geschrieben:Ich weiß ja nicht, was er vor hat.
Ich doch auch noch nicht. :lol:
Bei meiner Video-Verwaltung konvergiert die Motivation momentan wegen eines Zerwürfnisses der 3 Nutzer gegen Null.
Da hab ich mir was zum spielen gesucht und bin wegen der langweiligen About-Requester auf die Idee "About-tro" gekommen.
Xaby hat geschrieben: Hab mal nach OSDM gesucht. OldSchoolDemoMaker
http://www.pouet.net/prod.php?which=20544
Das ist ein kleines KlickyKlackyProgramm und das Resultat ist immer anschaulich /:->
Siehe auch hier, das Teil ist wohl in PB geschrieben :allright:

RSIDM = RSI (Red Sector Inc.) Demo Maker
AFAIR ist das der Demomaker, den DataBecker damals vertickt hat.

Von denen stammt AFAIK das weit verbreitetste Fomat der Font-Pics.
Haben sich aber nich alle dran gehalten, sodaß ich jetzt versuche, die ca. 700 Pics, die ich gefunden hab, irgendwie zu managen.
Is viel Schrott bei, aber auch ettliche arg gute.
Wenn die damals bloß mehr an Umlaute und Kleinbuchstaben gedacht hätten :cry:
Zuletzt geändert von scholly am 16.02.2008 12:29, insgesamt 1-mal geändert.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
Hoto
Beiträge: 294
Registriert: 01.09.2004 22:51

Beitrag von Hoto »

Ohja, der gute alte RSI Demo Maker, kenn ich noch aus besten Amiga Zeiten. Hab ich selbst damals ein paar kleine Demos gemacht, waren aber leider nie so gut wie von den Profis.

Stimmt, da die Demos meist eh nur in englisch waren, gibts kaum solche Font Maps mit Umlauten und an Groß/Kleinschrift kann ich mich auch kaum erinnern. Aber es waren wirklich einige schön designte Schriften dabei, die man gut wiederverwenden kann. Eventuell brauche ich für mein aktuelles Projekt auch mindestens eine solche Font Map. Auch etwas, mit dem ich mich bei PB noch nicht beschäftigt habe.
Antworten