Weiße Bildränder wegschneiden

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Dr. Shrek hat geschrieben:Aufgabe:
Wer schreibt den schnellsten Alghorithmus?
kein schlechter Vorschlag! Obwohl: Ich bin mit meinem Code oben schon
an meine persönlichen Tuning-Grenzen angelangt. ;-)

Was mich derzeit mehr interessieren würde: #NULL sprach schon an, dass es
gerade bei JPGs zu 'Verunreinigungen' von Farben kommen kann. Sprich:
Der Rand besteht nicht aus reinem Weiß, sondern sieht eher aus wie
schmutziger Schnee. Die Idee ist, dass man nicht nur die Randfarbe angeben
kann, sondern auch die maximale Abweichung mittels eines prozentualen
Wertes (muss mal heute abend ein wenig tüfteln, wie man das machen
kann).

Grüße ... Kiffi
Hygge
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Beitrag von DrShrek »

Kiffi hat geschrieben:
Dr. Shrek hat geschrieben:Aufgabe:
Wer schreibt den schnellsten Alghorithmus?
kein schlechter Vorschlag! Obwohl: Ich bin mit meinem Code oben schon
an meine persönlichen Tuning-Grenzen angelangt. ;-)

Was mich derzeit mehr interessieren würde: #NULL sprach schon an, dass es
gerade bei JPGs zu 'Verunreinigungen' von Farben kommen kann. Sprich:
Der Rand besteht nicht aus reinem Weiß, sondern sieht eher aus wie
schmutziger Schnee. Die Idee ist, dass man nicht nur die Randfarbe angeben
Nun das würde die ganze Sache nur noch interessanter machen. :wink:
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

für jeden kanal:

Abs( PointCol - TestCol ) < Proz * 2.55
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Kaeru Gaman hat geschrieben:für jeden kanal:
Abs( PointCol - TestCol ) < Proz * 2.55
meinst Du mit Kanal R, G und B? Warum Faktor 2.55?

Grüße ... Kiffi
Hygge
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

yo, R,G und B, wobei man nacheinander prüfen könnte,
dass er die anderen kanäle nicht extrahieren muss, wenn der erste drüber is.

> Warum Faktor 2.55?

x Prozent von 255 sind x*2.55 ;)

man könnte sich diese multiplikation sparen, wenn man die abweichung gleich in bytewert angibt.
andererseits muss man sie auch nur ein einziges mal durchführen, vor allen schleifen, is also auch egal.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Kaeru Gaman hat geschrieben:x Prozent von 255 sind x*2.55 ;)
ähm, ja, :oops: :wink:

Danke für die Infos & Grüße ... Kiffi
Hygge
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ich hab mal runtergeschrieben, wie ich mir den algo vorstelle.

getestet hab ichs noch nich..... ;)

Code: Alles auswählen

;************************************************** 
;** Tests a Point for being inside a 
;** color-range near a reference-value
;** 
;** needs an open Direct-Draw Channel
;** 
;** Arguments:
;** x.l , y.l   Coordinates of the tested Point
;** col.l       reference color
;** diff.l      percentage value the tested point
;**             may differ to be still tested true
;** 
;** Returns:
;** Boolean: True for Value in Range
;** 
;** By Kaeru Gaman, Nov.28th, 2006
;** PB-Ver 4.00
;**

Procedure ColTest(x.l, y.l, col.l, diff.f)
  Bdif = diff * 2.55
  pot = Point(x,y)
  Tdif = (pot & $0000FF) - (col & $0000FF)
  If Tdif >= -Bdif And Tdif <= Bdif
    Tdif = ((pot & $00FF00)>>8) - ((col & $00FF00)>>8)
    If Tdif >= -Bdif And Tdif <= Bdif
      Tdif = ((pot & $FF0000)>>16) - ((col & $FF0000)>>16)
      If Tdif >= -Bdif And Tdif <= Bdif
        ProcedureReturn #True
      Else
        ProcedureReturn #False
      EndIf
    Else
      ProcedureReturn #False
    EndIf
  Else
    ProcedureReturn #False
  EndIf  
EndProcedure

......and now for something totally different:

das pixelgenaue positionieren des auswahlrahmens in Irfan geht einfacher,
wenn man vorher die ansicht zoomt.... ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Beitrag von DrShrek »

Dr. Shrek hat geschrieben:Es wird ein Programmgerüst geliefert mit einer leeren Funktion:
Rect = GetRect(Image, Color)
Jetzt fehlt nur noch das Programmgerüst und es kann los gehen.
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Kaeru Gaman hat geschrieben:das pixelgenaue positionieren des auswahlrahmens in Irfan geht einfacher,
wenn man vorher die ansicht zoomt.... ;)
nee, ehrlich jetzt? :mrgreen:

Aber im ernst: bei Bilder, die mal locker 5000 Pxls in Breite und Höhe haben,
kann das mit dem Auswahlrahmen schon mal etwas länger dauern ;-)

Thx 4 Code!

Grüße ... Kiffi
Hygge
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Dr. Shrek hat geschrieben:[...]
Wer schreibt den schnellsten Alghorithmus?
[...]
Einschränkungen:
1) Es darf nur die Point() Funktion zum Auslesen der Farbe verwendet werden.
2) Nur PB Code ohne Assembler [...]
Na mit den Einschraenkungen wird der schnellste Code aber immer noch
sehr sehr langsam sein.
Antworten