Antialiasing mit Maskcolor von ??? |
Hier ein kleines Programm, mit dem ein Bild mit Antialiasing um die Hälfte verkleinert werden kann. Das besondere ist, dass eine Maskcolor berücksichtigt wird, so dass man nicht das übliche Problem mit der zerschossenen Maske hat. -Das Bild wird unter neuem Namen mit Anhängsel _A.bmp gespeichert -Die Kanten müssen eine gerade Anzahl Pixel haben Der Parameter Skip gibt an, ab wieviel umliegenden MaskPixel die Maskcolor anstelle des errechneten Wertes verwendet wird. hier v.l. das Originalbild, dann die verkleinerten Bilder mit Skip 0-3 Damit man was erkennt hab ich das dann wieder vergrössert: [img:e2db593cd3]http://www.mein-murks.de/grafik/winner.png[/img:e2db593cd3] [code:1:e2db593cd3] Graphics 400,200,16,3 Const c_mx = 3 skip = 3 ;between 0 and 3 maskcolor = $FF00FF Dim Col(c_mx) file$ = CommandLine$() If Not Len(file$) file$ = Input$("Datei: ") Else Print "Verarbeite Datei: " + file$ EndIf start = LoadImage(file$) If Not start Then RuntimeError "Datei nicht gefunden!" ausgabe = CreateImage(ImageWidth(start)/2,ImageHeight(start)/2) If Not ausgabe Then RuntimeError "Fehler!" LockBuffer ImageBuffer(start) LockBuffer ImageBuffer(ausgabe) For x = 0 To ImageWidth(ausgabe)-1 For y = 0 To ImageHeight(ausgabe)-1 hx = x Shl 1 hy = y Shl 1 maskcnt = 0 For u = 0 To c_mx Col(u) = ReadPixelFast(hx+(u Shr 1),hy+(u And 1),ImageBuffer(start)) And $FFFFFF;kein Alphakanal If col(u) = maskcolor Then maskcnt = maskcnt + 1 Next If maskcnt > skip Then WritePixelFast x, y, maskcolor, ImageBuffer(ausgabe) Else writecol = 0 For u = 0 To c_mx If Col(u) <> Maskcolor Select maskcnt Case 0 writecol = writecol + ((Col(u) And $FCFCFC) Shr 2) Case 1 writecol = writecol + (((Col(u) Shr 16) And $FF) / 3) Shl 16 ;R writecol = writecol + (((Col(u) Shr 8) And $FF) / 3) Shl 8 ;G writecol = writecol + (Col(u) And $FF) / 3 ;B Case 2 writecol = writecol + ((Col(u) And $FEFEFE) Shr 1) Case 3 writecol = Col(u) End Select EndIf Next WritePixelFast x, y, writecol, ImageBuffer(ausgabe) EndIf Next Next UnlockBuffer ImageBuffer(start) UnlockBuffer ImageBuffer(ausgabe) datei$ = Left (File$,Instr (File$,".")-1) + "_A.bmp" SaveImage (ausgabe, datei$) Print datei$ + " erzeugt!" WaitKey() [/code:1:e2db593cd3] Hier noch das Coding zum Download: [url]http://www.mein-murks.de/quellcode/antialias.bb[/url] |
von ??? |
Und wozu brauch man das :?: :cry: |
von ??? |
Ich brauch das z.B. für Rendergrafiken, da beim Rendern mit Antialiasing der Hintergrund mit einbezogen wird(kann man in dem verwedeten Programm meines Wissens nicht umstellen). Beim Resizen über das 2-D-Grafikprogramm wird ebenfalls keine Hintergrundfarbe berücksichtigt und ohne Antialiasing schauts *beschissen* aus... Jetzt render ich in der doppelten Auflösung und lass dann den Algo drübersausen(bzw. kriechen :) ). Könnte auch nützlich sein um z.B. Grafiken aus dem Internet entsprechend zu verkleinern... Oder um verkleinerte Bilder seiner Spielgrafiken zu erstellen (z.B. für eine Minimap oder kleinere Auflösungen) |
von ??? |
Schönes Programm, und nützlich. |
von ??? |
Ich hab mir eben mal überlegt, wie man den verschwommenen Rand wegkriegt. Konnte es nicht testen, weil ich zur Zeit kein 32bit Modus starten kann. Wenn´s also nicht funktioniert, dann bitte nicht schlagen. [code:1:78f60ed4e1]Function groesse_aendern(inbild%, maskcolor%, breiteneu%, hoeheneu%) Local breitealt% = ImageWidth(inbild%) Local hoeheealt% = ImageHeight(inbild%) Local tmpbild% = CopyImage(inbild%) Local outbild% = CopyImage(inbild%) TFormFilter 0 ResizeImage tmpbild%, breiteneu%, hoeheneu% TFormFilter 1 ResizeImage outbild%, breiteneu%, hoeheneu% If maskcolor% = 0 Then tmpmaskcolor%= $FFFFFF Else tmpmaskcolor%= 0 EndIf LockBuffer ImageBuffer(tmpbild%) For x% = 0 To (breiteneu% - 1) For y% = 0 To (hoeheneu% -1) If Not((ReadPixelFast(x%, y%, ImageBuffer(tmpbild%)) And $FFFFFF) = maskcolor%) Then WritePixelFast(x%, y%, tmpmaskcolor%, ImageBuffer(tmpbild%)) EndIf Next Next UnlockBuffer ImageBuffer(tmpbild%) MaskImage tmpbild%, 0, 0, tmpmaskcolor% SetBuffer ImageBuffer(outbild%) DrawImage tmpbild%, 0, 0 FreeImage tmpbild% Return outbild% End Function[/code:1:78f60ed4e1] |