Farbanzahl ermitteln...

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

wherewolf

Betreff: Farbanzahl ermitteln...

BeitragSo, Dez 30, 2007 20:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute

Ich arbeite im Moment an einem kleinen Bildspeicherprogramm. Seit ich es von BlitzBasic auf BlitzMax rübergecodet habe, werden viel mehr Farben gespeichert als eigentlich vorhanden sind. Bei einem Bild mit nur 3 Farben werden über 100 angezeigt etc. Wenn ihr zb diese Grafik: http://www.wintonet.de/grafik.gif mal (als bmp) öffnet oder ein anderes Bild mit sehr wenigen Farben, seht ihr was ich meine.
Findet ihr vielleicht den Fehler in meinem Code?

Gruss wolf


Code: [AUSKLAPPEN]

'farbzähler
Graphics 800,600,0,60

img_name_open$=GInput$("Name des Bildes: (mit Endung) ")
img=LoadPixmap(img_name_open$)

Cls
DrawPixmap img,0,0
Flip
WaitKey()


Type TFarbe
 Field rgb
EndType

Local farb_list:TList=CreateList()

'-----------------------------------------------------------------------------------------------------------
'Hier beginnt der Teil, welcher die Farbanzahl herausfinden soll

For y=0 To PixmapHeight(img)-1
 For x=0 To PixmapWidth(img)-1
  Local gefunden=0
  current_rgb=ReadPixel(img,x,y)
  For f:TFarbe=EachIn farb_list
   If current_rgb=f.rgb Then gefunden=1 ; Exit
  Next
  If gefunden=0 Then
   Local nf:TFarbe
   nf=New TFarbe
   nf.rgb=current_rgb
   farb_list.addlast(nf)
  Cls; DrawText farb_list.count(),0,0 ; Flip
  EndIf
 Next
Next

WaitKey()

'-----------------------------------------------------------------------------------------------------------

Function GInput$(text$,x=0,y=0)
'Ersetzt die Input-Funktion im grafischen Fenster. Wenn für x und y keine Werte übergeben wurden
'werden sie auf 0 gesetzt. Liefert -1 zurück wenn sie abgebrochen wurde.

 FlushKeys()

 Type TChar
  Field zeichen$
 End Type
 
 
 Local char_list:TList=CreateList()

 While Not KeyHit(Key_enter)
  If KeyHit(key_escape) Then text$="-1" ; Exit

  'Textausgaben
  DrawText text$,x,y
  Local zaehler=0
  For c:TChar=EachIn char_list
   DrawText c.zeichen$,x+TextWidth(text$)+zaehler,y
   zaehler=zaehler+TextWidth(c.zeichen$)
  Next

  'Eingabeänderungen
  current_char=GetChar()
  If Not current_char=0 Then 'eine Taste wurde gedrückt
   If current_char=8 And Not char_list.Count()=0 Then 'die rücktaste wurde gedrückt, lösche ein zeichen
    char_list.removelast()
   Else
    Local NewChar:TChar
    NewChar=New TChar
    NewChar.zeichen$=Chr(current_char)
    ListAddLast char_list,NewChar
   EndIf

  EndIf

  Flip;Cls 
 Wend

 'der eingegebene Text wird zurückgegeben und die liste gelöscht
 Local text_return$="" 
 For c:TChar=EachIn char_list
  text_return$=text_return$+c.zeichen$
 Next
 char_list.clear()

 FlushKeys()
 Return text_return$

End Function

(vereinfacht, sollte nur die Anzahl der Farben bestimmen)

rema

BeitragMo, Dez 31, 2007 12:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Soviel wie ich weiss, kann man keine GIF's laden. Wandle es in PNG um, bloss nicht in JPG !!!

Und noch eine kleine Hilfe:

Statt per Input das Verzeichnis und so anzugeben,
Zitat:
img_name_open$=GInput$("Name des Bildes: (mit Endung) ")


kannst du per Requestfile dich bequem durchs Verzeichnis durchklicken:
Zitat:
Local img_name_open:String = RequestFile("Welches Bild?")

Suco-X

Betreff: ......

BeitragMo, Dez 31, 2007 12:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Jedes Grafikprogramm wird dir bestätigen, dass deine Grafik oben mehr als 3 Farben hat. Das liegt daran, dass gif durch seine 256 Farben deine Grafiken genauso zerstört wie das jpg Format. Wenn du ein korrektes Ergebnis willst, erstelle eine Grafik und benutze nur das bmp oder png Format. Einmal nach gif oder jpg rüber und wieder zurückkonvertieren ist auch nicht, die beiden Formate zerstören die Grafik für immer.
Habe deinen Code mit einer von mir erstellten Grafik getestet, funktioniert ohne Probleme.
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Cardonic

BeitragMo, Dez 31, 2007 14:14
Antworten mit Zitat
Benutzer-Profile anzeigen
In diesem Fall ist es nicht so, dass die Graphik durch das Gif-Format zerstört wird.
Gif unterstützt schon nur bis 256 Farben; aber es werden _niemals_ aus wenig Farben mehr.
Wenn man genau hinschaut ist zwischen den verschiedenen Farben ein Antialiasing;
daher die vielen Farben.

mfg Cardonic
 

wherewolf

BeitragMo, Dez 31, 2007 21:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke sehr! Mit .bmp Files funktioniert es einwandfrei. In der fortgeschritteneren Version mit BB hat es allerdings auch für .jpgs geklappt. Ich teste gerade, ob das mit einer "qualitätsfunktion" zusammenhängt, welche ich in BM noch nicht drin hab. Könnte sein das dort die .jpg-Bilder in ein "gutes" Format umgewandelt werden, so als günstiger Nebeneffekt. Vielen Dank noch mal.

@rema: Danke noch für den zweiten Tipp. Wenn es das ist was ich denke, hab ich das bei BB mühsam selbst programmiert. Naja, kleiner Lerneffekt Wink
 

wherewolf

BeitragMo, Dez 31, 2007 22:32
Antworten mit Zitat
Benutzer-Profile anzeigen
@rema: Ne, scheint doch nicht ganz das zu sein. Ich verwende GInput() weil die Input-Funktion nur in der Konsolenansicht erscheint. (oder kann man das auch ändern?) Da habe ich mit RequestFile() das gleiche Problem. Und ich progge dann glaub lieber grad ne nette Fensterstruktur für das Dateimenü (wie in BB)

gruss wolf

BladeRunner

Moderator

BeitragDi, Jan 01, 2008 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Bitte keine Doublepostings, sonst werd ich schliessen.
Der Editbutton ist oben rechts , benutz den bitte.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Triton

BeitragDo, Jan 03, 2008 17:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Dein Beispielbild da oben hat 67 Farben. Vergrößere dir mal die Kante eines
Buchstabens, da sieht man gut die Kantenglättung und das Dithering bei den
Farbflächen.

Im bb-Codearchiv habe ich auch mal was entsprechendes gepostet:

https://www.blitzforum.de/foru...hp?t=14584
Coding: silizium-net.de | Portfolio: Triton.ch.vu

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group