Weichzeichnen mit 2D-Drawing
- Hroudtwolf
- Beiträge: 1416
- Registriert: 30.10.2004 23:33
- Kontaktdaten:
Weichzeichnen mit 2D-Drawing
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.......
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.......
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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...nur so ne idee...
aber vielleicht ist das ja eine von den 1000 sachen, die du schon probiert hast...
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
aber vielleicht ist das ja eine von den 1000 sachen, die du schon probiert hast...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
- Hroudtwolf
- Beiträge: 1416
- Registriert: 30.10.2004 23:33
- Kontaktdaten:
Das isses............
Vielen Dank Leute..........
und "Kaeru Gaman" du bist ein Genie.....!!!

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

- freedimension
- Admin
- Beiträge: 1987
- Registriert: 08.09.2004 13:19
- Wohnort: Ludwigsburg
- Kontaktdaten:
Re: Das isses............
Also nix für ungut, aber das geäußerte ist eigentlich Basiswissen für alle die mit Grafikprogrammierung zu tun haben.Hroudtwolf hat geschrieben: und "Kaeru Gaman" du bist ein Genie.....!!!
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

-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
pöh! freedimension, du bist doch nur eifersüchtig! (
)
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....

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....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
- Hroudtwolf
- Beiträge: 1416
- Registriert: 30.10.2004 23:33
- Kontaktdaten:
Kein Basiswissen
@ 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........

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........
