Image aus Sprite

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
PureBuster
Beiträge: 40
Registriert: 30.05.2008 09:54
Computerausstattung: erbärmlich
Wohnort: Niedersachsen / Bremen

Image aus Sprite

Beitrag von PureBuster »

Hallo zusammen;

gibt es eine Möglichkeit aus einem Sprite auch wieder ein Image zu erhalten?
Bislang habe ich nur die ziemlich umständliche und lahme Variante über SaveSprite() und anschliessendem LoadImage() gefunden, aber das muss doch auch besser gehn!?

Danke schon mal.
...coden ist wie zum Psychoklempner gehn...manchmal muss man einfach drüber reden..
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

nicht ohne dementsprechend großen Aufwand über verschiedene API funktionen...

die Frage ist: wieso und wofür?

was für Bilddaten kannst du denn nur als Sprite bekommen, und wieso sollen sie ein Image werden?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Themenbezogen:
Kaeru Gaman hat geschrieben:ein Grundprinzip bei jeder Programmierung ist nunmal Solve The Right Problem!

Ein Programmierer hat eine gewisse Problemstellung, überlegt sich einen Lösungsweg,
und hängt am Ende an einem ganz bestimmten Punkt, an dem er sich die Zähne ausbeißt.

In diesem Fall ist der Endpunkt "aus einem Sprite ein Image machen".

das ist generell nicht vorgesehen und nur mit extremem Aufwand möglich, die temporäre Datei ist noch das Allereinfachste.


Je nachdem wie seine Problemstellung aussieht, ist aber die ganze Herangehensweise zu umständlich.
Vielleicht läßt sich das was er vorhat ja ganz anders und wesentlich einfacher lösen.

der Troll-Auswurf wurde entsorgt - Kaeru fecit
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PureBuster
Beiträge: 40
Registriert: 30.05.2008 09:54
Computerausstattung: erbärmlich
Wohnort: Niedersachsen / Bremen

kleine Schritte, grosses Ziel

Beitrag von PureBuster »

das zu erklären, muss ich etwas ausholen:
Das grosse Ziel soll sein: ein Prog um Rastergrafiken versch. Art (1-32bit) in Vektorgrafiken zu wandeln. Ausgabeformate: svg und ascii-cgm.
Die ersten Versuche sind gut gelaufen. Der grobe Vorgang ist, die Rasterimages zu vereinfachen, in mehrere Images zu zerlegen, z.B. farbabhängig, und via potrace eine svg draus zu generieren. Nachdem nun die svgs wieder zusammen gefahren sind, ergibt sich ein Gesammtbild, welches ich ggf. auch nach .cgm konvertiere (daran arbeite ich noch). Das grosse Problem sind die Parameter der Farbabstufungen und der "Gruppenbildung" für Vektorisierung. Hier möchte ich dem Bediener ein Interface bieten, über welches er Einfluss nehmen kann und z.B. Farbbereiche zusammenfassen, feiner aufsplitten oder ignorieren lassen kann. Das bekomme ich am schönsten (glaube ich) mit sprites hin. Der Teil aber, den ich bereits "fertig" habe, basiert auf der Manipulation von Images; desshalb möchte ich aus den Spites gerne wieder Images erzeugen. Der Umweg über Dateien ist dabei zu lahm, um irgendwelche Vorschauen in Echtzeit zu erzeugen. Bei einem Screenshot geht mir zu viel Information verloren. Daher die Frage ob man auf schnellem Wege Sprites in Images konvertieren kann.
...coden ist wie zum Psychoklempner gehn...manchmal muss man einfach drüber reden..
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Daher die Frage ob man auf schnellem Wege Sprites in Images konvertieren kann.
das wird wohl irgendwie gehen, über API auf die Bitmaps zugreifen,
aber eben ziemlich aufwendig, und -zig operationen in "echtzeit", das wird kritisch.

> Das bekomme ich am schönsten (glaube ich) mit sprites hin.
das ist die große frage, ob es wirklich schöner und besser mit sprites geht,
dass sich der aufwand rentieren würde...

> Farbbereiche zusammenfassen, feiner aufsplitten oder ignorieren
müßte meiner Ansicht nach sowieso ein Draw-vorgang sein,
mir wäre jetzt jedenfall nichts bekannt, womit solche manipulationen über sprites bequemer wären..


es gibt in verschiedenen Grafikprogrammen Füllwerkzeuge mit Toleranz. d.h. ähnlich wie ein AreaFill,
bloß nicht auf einer einzigen Zielfarbe sondern mit einer gewissen prozentualen Abweichung.
das könnte in ungefähr dem entsprechen was dir vorschwebt.
solche Funktionen werden über einen direkten Zugriff auf die Image-Bitmap durchgeführt,
oder auf eine eigene Klasse die von einem Image abgeleitet wurde.


Sprites und DirectX-Grafik sind für schnelle Darstellung bereits vorhandenen Contents ausgelegt.
inbuilt-Funktionen sind hier Shader und all so was, also Funktionen um Effekte auf Texturen zu zaubern die eine 3D-Welt realistischer wirken lassen.

Jegliche selber programmierte Manipulation solcher im GRAM gespeicherten Informationen
ist zwangsweise langsamer als Manipulation von Informationen im Hauptspeicher.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
kswb73
Beiträge: 319
Registriert: 04.02.2008 16:51
Kontaktdaten:

Beitrag von kswb73 »

Mh, vielleicht könntest du deine Images direkt auf einen Screen zaubern, indem du drawImage(ImageID, X, Y [,Breite, Höhe]) verwendest. So könntest du dein Image ganz normal im Speicher manipulieren und müsstest nicht immer alles Umwandeln.
Windows XP: PB 4.31, PB 4.4, PB 4.51
Open Suse 11.2: PB 4.4
Benutzeravatar
PureBuster
Beiträge: 40
Registriert: 30.05.2008 09:54
Computerausstattung: erbärmlich
Wohnort: Niedersachsen / Bremen

Sprites

Beitrag von PureBuster »

Der Grund, warum ich dafür Sprites verwenden wollte, ist die Übersicht zu behalten. Einmal für den Nutzer, denn ich stelle mir vor, dass ich die Navigation durch Sprites recht gut visualisieren kann, indem ich z.B. die ausgewählten Sprites hervorhebe, aufglühen lasse, andere ausblende o.ä. Bei Images ist sowas stehts mit zeitaufwendigen Zeichenoperationen verbunden. Auch hatte ich mir vorgestellt, Vorgänge einfacher auswerten zu können, wie z.B. über welchem Sprite steht denn nun der Mauszeiger u.ä.
Nicht zuletzt stehen für die Manipulation von Sprites einfach mehr Funktionen zur Verfügung. Nachdem ich eure Einschätzung aber gelesen habe, komme ich davon wohl langsam ab. Danke erstmal.
...coden ist wie zum Psychoklempner gehn...manchmal muss man einfach drüber reden..
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

hervorheben oder aufglühen ist auch mit sprites aufwendig...

weglassen kann man auch Images.

ich war jetzt eigentlich davon ausgegangen, dass du Einzelelemente die du als Images vorliegen hast per DrawImage in ein Großes Image das deine Zeichenfläche darstellt zeichnest.

> Nicht zuletzt stehen für die Manipulation von Sprites einfach mehr Funktionen zur Verfügung.

äh... ? was meinst du?

sämtliche Sprite3D funktionen beziehen sich allein auf die Darstellung auf dem Bildschirm.
diese aus einem Screen wieder rauszuholen und ein Sprite draus zu machen ist alleine für sich schon übermäßig aufwendig.


> wie z.B. über welchem Sprite steht denn nun der Mauszeiger u.ä.

SpritePixelCollision ist in der Tat der einzige wirkliche Vorteil, der meiner Ansicht nach noch bleibt.
der fällt allerdings bei Sprite3D auch weg, damit geht das garnicht.

aber auch dafür kann man sich ein brauchbares workaround für Images ausdenken....
Zuletzt geändert von Kaeru Gaman am 05.05.2009 16:31, insgesamt 2-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Re: Sprites

Beitrag von Fluid Byte »

PureBuster hat geschrieben:Einmal für den Nutzer, denn ich stelle mir vor, dass ich die Navigation durch Sprites recht gut visualisieren kann, indem ich z.B. die ausgewählten Sprites hervorhebe, aufglühen lasse, andere ausblende o.ä.
Dafür gibt's PNG-Bilder mit Alphakanal.
PureBuster hat geschrieben:Nicht zuletzt stehen für die Manipulation von Sprites einfach mehr Funktionen zur Verfügung.
Das lässt sich kaum vergleichen. Das eine ist für Screens, also Spiele und Multimedia, das andere für Desktop-Anwendungen.
Windows 10 Pro, 64-Bit / Outtakes | Derek
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Beitrag von super_castle »

Also ist relativ einfach aus einem Sprite ein Image zu erzeugen.
Suche den Memspeicher vom Sprite und kannst hiermit ein Image machen.
Dieses Programm benutze ich selber. Hab es hier im Forum gefunden. . Ist Superschnell . Brauchs es nur ein bisschen anpassen.

Code: Alles auswählen

CreateImage(0,1280,1024)

StartDrawing(ImageOutput(0)) 
  Box(10,10,100,100,#White)
StopDrawing()

CreateImage(1,1280,1024)

Procedure CopyImageToMem(Img.l, *mem)
  Protected bmi.BITMAPINFO
  Protected w.l, h.l, hBmp.l, hDC.l
 
  w = ImageWidth(Img)
  h = ImageHeight(Img)
  hBmp = ImageID(Img)
 
  bmi\bmiHeader\biSize        = SizeOf(BITMAPINFOHEADER)
  bmi\bmiHeader\biWidth       =  w
  bmi\bmiHeader\biHeight      =  h
  bmi\bmiHeader\biPlanes      =  1
  bmi\bmiHeader\biBitCount    =  32
  bmi\bmiHeader\biCompression = #BI_RGB
 
  hDC = StartDrawing(ImageOutput(Img))
  If GetDIBits_(hDC, hBmp, 0, h, *mem, bmi, #DIB_RGB_COLORS)
    StopDrawing()
    ProcedureReturn #True
  Else
    StopDrawing()
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure CopyMemToImage(Img.l, *mem)
  Protected bmi.BITMAPINFO
  Protected w.l, h.l, hBmp.l, hDC.l
 
  w = ImageWidth(Img)
  h = ImageHeight(Img)
  hBmp = ImageID(Img)
 
  bmi\bmiHeader\biSize        = SizeOf(BITMAPINFOHEADER)
  bmi\bmiHeader\biWidth       =  w
  bmi\bmiHeader\biHeight      =  h
  bmi\bmiHeader\biPlanes      =  1
  bmi\bmiHeader\biBitCount    =  32
  bmi\bmiHeader\biCompression = #BI_RGB
 
  hDC = StartDrawing(ImageOutput(Img))
  If SetDIBits_(hDC, hBmp, 0, h, *mem, bmi, #DIB_RGB_COLORS)
    StopDrawing()
    ProcedureReturn #True
  Else
    StopDrawing()
    ProcedureReturn #False
  EndIf
EndProcedure

wi = ImageWidth(0)
hi = ImageHeight(0)

*buffer = AllocateMemory(wi*hi*4)


Debug CopyImageToMem(0,*buffer)

Debug CopyMemToImage(1,*buffer)
Antworten