Image aus Sprite
- PureBuster
- Beiträge: 40
- Registriert: 30.05.2008 09:54
- Computerausstattung: erbärmlich
- Wohnort: Niedersachsen / Bremen
Image aus Sprite
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.
			
			
									
									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
- 
				Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Themenbezogen:
der Troll-Auswurf wurde entsorgt - Kaeru fecit
			
			
									
									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.
						Der Weise weiß, dass er ein Narr ist.
- PureBuster
- Beiträge: 40
- Registriert: 30.05.2008 09:54
- Computerausstattung: erbärmlich
- Wohnort: Niedersachsen / Bremen
kleine Schritte, grosses Ziel
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.
			
			
									
									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
> 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.
			
			
									
									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.
						Der Weise weiß, dass er ein Narr ist.
- PureBuster
- Beiträge: 40
- Registriert: 30.05.2008 09:54
- Computerausstattung: erbärmlich
- Wohnort: Niedersachsen / Bremen
Sprites
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.
			
			
									
									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
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....
			
			
													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.
						Der Weise weiß, dass er ein Narr ist.
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
Re: Sprites
Dafür gibt's PNG-Bilder mit Alphakanal.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.ä.
Das lässt sich kaum vergleichen. Das eine ist für Screens, also Spiele und Multimedia, das andere für Desktop-Anwendungen.PureBuster hat geschrieben:Nicht zuletzt stehen für die Manipulation von Sprites einfach mehr Funktionen zur Verfügung.
Windows 10 Pro, 64-Bit / Outtakes | Derek
						- 
				super_castle
- Beiträge: 557
- Registriert: 29.11.2005 15:05
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.
			
			
									
									
						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)


