Seite 1 von 1

Weichzeichnen mit 2D-Drawing

Verfasst: 09.12.2004 04:08
von Hroudtwolf
Hallo liebe Basic-Kundige,


Hat jemand von euch 'ne gute 2d_Drawing Methode parat um
auf einem image eine weichzeichenopereration durchzuführen.
hab schon tausende Variationen ausprobiert.Aber irgendwie steck ich im Sack.......

Verfasst: 09.12.2004 04:46
von Kaeru Gaman
probier doch mal, dir nen algrhythmus zu stricken,
bei dem du für jeden bildpunkt einen neuen farbwert
aus ihm und den umgebenden 8 bildpunkten berechnest

OOO
OXO
OOO

die eckpunkte müssen vielleicht schwächer einfliessen als die seitenpunkte,
da ihre entfernung um sqr(2) grösser ist.
wenn du den allgemeinen prozentsatz des einflusses variabel hälts,
kannst du einen weichzeichnungs-faktor mit an die proc übergeben.

also

Code: Alles auswählen

Outer=((Eck1+Eck2+Eck3+Eck4)/sqr(2)+(Side1+Side2+Side3+Side4))/8
New=(Outer*Proz+Inner*(100-Proz))/100
...nur so ne idee...

aber vielleicht ist das ja eine von den 1000 sachen, die du schon probiert hast...

Verfasst: 09.12.2004 09:13
von Dostej
Es gibt irgendwo in den tiefen der Netzes einige gute Artikel, wie man Bilder verändert (auf Pixelbasis). Da findest Du das und auch nch einige andere nette Säuereien, die man machen kann...

Verfasst: 09.12.2004 12:17
von dige
Schau Dir doch einfach die Effects Libs von Mischa an ( auf PureArea.net )
das sind weichzeichnungs- und schärfe-algos drin.

cya dige

Das isses............

Verfasst: 10.12.2004 02:03
von Hroudtwolf
Vielen Dank Leute..........


und "Kaeru Gaman" du bist ein Genie.....!!!

:D

Re: Das isses............

Verfasst: 10.12.2004 11:04
von freedimension
Hroudtwolf hat geschrieben: und "Kaeru Gaman" du bist ein Genie.....!!!
Also nix für ungut, aber das geäußerte ist eigentlich Basiswissen für alle die mit Grafikprogrammierung zu tun haben.
Das schließt jetzt natürlich nicht aus, dass er nicht vielleicht doch ein Genie ist nur halte ich es für etwas übertrieben seine Antwort oben als Beweis anzuführen (hab nix gegen die Antwort, ist alles richtig soweit) ;-)

Vielleicht helfen ja diese Codeschnipsel hier weiter:

Code: Alles auswählen

Procedure CopyImageToMem(Img.l, mem.l)
  Protected bmi.myBITMAPINFO
  Protected w.l, h.l, hBmp.l, hDC.l
  UseImage(Img)
  w = ImageWidth()
  h = ImageHeight()
  hBmp = ImageID()
  
  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() )
  If GetDIBits_(hDC, hBmp, 0, h, mem, bmi, #DIB_RGB_COLORS)
    StopDrawing()
    ProcedureReturn #True
  Else
    StopDrawing()
    ProcedureReturn #False
  EndIf
EndProcedure
Procedure CopyMemToImage(mem.l, Img.l)
  Protected bmi.myBITMAPINFO
  Protected w.l, h.l, hBmp.l, hDC.l
  UseImage(Img)
  w    = ImageWidth()
  h    = ImageHeight()
  hBmp = ImageID()
  
  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() )
  If SetDIBits_(hDC, hBmp, 0, h, mem, bmi, #DIB_RGB_COLORS)
    StopDrawing()
    ProcedureReturn #True
  Else
    StopDrawing()
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure Filter(mem.l, w.l, h.l)
  w_1 = w - 1
  h_1 = h - 1
  h_2 = h - 2
  w_2 = w - 2

  pitch.l = w_1<<2
  pitch2.l = pitch<<1
  pitch_return.l = pitch * h_2 - 4

  Dim dummy(w_1, h_1)

  ; 1st Pass
  *pos.LONG = mem
  *dummy.LONG = @dummy()+4
  For y = 0 To h_1
    For x = 1 To w_2
      c1 = *pos\l
      *pos + 8
      c3 = *pos\l
      *pos - 4
      c2 = *pos\l

      red   = (c1 & $FF0000) + (c2 & $FF0000)<<1 + (c3 & $FF0000)
      green = (c1 & $FF00)   + (c2 & $FF00)<<1   + (c3 & $FF00)
      blue  = (c1 & $FF)     + (c2 & $FF)<<1     + (c3 & $FF)
      red   = red   >> 18
      green = green >> 10
      blue  = blue  >> 2

      red   = red   << 16
      green = green << 8

      ; Zwischenspeichern
      *dummy\l = red + green + blue
      *dummy + 4
    Next
    *pos   + 8
    *dummy + 8
  Next
  
  ; 2nd Pass
  *pos.LONG = @dummy()
  *dummy.LONG = mem + pitch
  For x = 0 To w_1
    For y = 1 To h_2
      c1 = *pos\l
      *pos + pitch2
      c3 = *pos\l
      *pos - pitch
      c2 = *pos\l

      red   = (c1 & $FF0000) + 2*(c2 & $FF0000) + (c3 & $FF0000)
      green = (c1 & $FF00)   + 2*(c2 & $FF00)   + (c3 & $FF00)
      blue  = (c1 & $FF)     + 2*(c2 & $FF)     + (c3 & $FF)
      red   = red   >> 18
      green = green >> 10
      blue  = blue  >> 2
      
      red   = red   << 16
      green = green << 8
      
      ; Ins Original schreiben
      *dummy\l = red + green + blue
      *dummy + pitch
    Next
    *pos - pitch_return
    *dummy - pitch_return
  Next
EndProcedure
Musst aber selber schauen ob du damit zurechtkommst ;-)

Verfasst: 10.12.2004 13:12
von Kaeru Gaman
pöh! freedimension, du bist doch nur eifersüchtig! ( :wink: )

ich nehm das 'genie' mal als kompliment,
und komplimente sind immer übertreibungen.

für dich FD mag das basiswissen sein,
ich hab darüber nirgentwo was gelesen,
das ist mit eigener logig ausgekocht.

@hroudtwolf:

statt '/sqr(2)' kannst du einfach '*0.7' schreiben, das ist genau genug.

1/sqr(2) = sin(45°) = 0.70710....

Kein Basiswissen

Verfasst: 11.12.2004 02:59
von Hroudtwolf
@ freedimension

Ich glaube auch nicht, daß es Basiswissen ist.....
Es ist eher eine einfache aber effektive Lösung die hier gefunden wurde.
Basiswissen steht im Handbuch.......Ich hab die Antwort von Kaeru Gaman aber nicht im Handbuch gefunden.

Das mit dem Genie war auch nicht ganz ernst gemein(auch wenn er es sogar vieleicht ist).(Weiß man ja nicht.........)
es war eher eine Freudbekundung, daß er eine so effektive Lösung vorgebracht hat....

Und...........Danke auch für deine Hilfe......probiere mich damit gleich mal aus........
:allright: