Buchempfehlung
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
"Der" Petzold, das über 1000 Seiten starke Standardwerk zum Win32-API - besonders nützlich u. a. bei der GUI-Programmierung in FreeBASIC! [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Code-Beispiel

Code-Beispiele » Grafik und Fonts

ImageScale2x

Lizenz:Erster Autor:Letzte Bearbeitung:
GPLRedakteurVolta 16.11.2008

ImageScale2x ist eine bewertete Vergrößerung von Bildpunkten (Pixel) nach dem Verfahren wie es Andrea Mazzoleni hier beschreibt:
Externer Link!http://scale2x.sourceforge.net/algorithm.html

Es eignet sich um kleine Icons ohne starke Rasterung zu Vergrößern.
scale2x
Ein Testprogramm steht im Anhang zur Verfügung.
Beim testen stellte ich fest, dass damit auch die fbFonts stark vergrößert eine "gute Figur" machten. :))

'ImageScale2x (source image ptr, _
'        dest Pointer to start of pixel, dest pixel per line)
Sub ImageScale2x(ByVal Image As UInteger Ptr, _
  ByVal Dest As UInteger Ptr, dp As Integer)

  Dim As UInteger B,D,E,F,H
  Dim As Integer j, k, ic, dc, x, y, pitch
  ImageInfo image,x,y,,pitch,image
  pitch \= 4
  '|A|B|C|
  '+-+-+-+  / |E0|E1|
  '|D|E|F| E  +--+--+
  '+-+-+-+  \ |E2|E3|
  '|G|H|I|

  For k  = 0 To y-1
    For j  = 0 To x-1
      If k Then B = Image[ic - pitch] Else B = Image[ic]
      If k = y-1 Then H = Image[ic] Else H = Image[ic + pitch]
      If j Then
        D = E
        E = F
      Else
        E = Image[ic]
        D = E
      EndIf
      If j < x-1 Then F = Image[ic + 1]
      If B <> H And D <> F Then
        If D = B Then Dest[dc] = D Else Dest[dc] = E
        If B = F Then Dest[dc + 1] = F Else Dest[dc + 1] = E
        If D = H Then Dest[dc + dp] = D Else Dest[dc + dp] = E
        If H = F Then Dest[dc + dp +1] = F Else Dest[dc + dp +1] = E
      Else
        Dest[dc] = E
        Dest[dc + 1] = E
        Dest[dc + dp] = E
        Dest[dc + dp +1] = E
      End If

      ic +=1
      dc +=2
    Next j
    ic = ic+pitch-x
    dc = dc+((dp-x)*2)
  Next k
End Sub

Eine Version mit Inlineasm ist ca 20% schneller.
Hier wird der cmov(cc)-Befehl verwendet, der erst ab dem Pentium Pro eingeführt wurde. Ob deine CPU diesen Befehl ausführen kann wird in einer Funktion abgeklärt.

Sub ImageScale2x_asm(ByVal Image As UInteger Ptr, _
  ByVal Dest As UInteger Ptr, dp As Integer)

  Dim As UInteger B,D,E,F,H
  Dim As Integer j, k, ic, dc, x, y, pitch
  ImageInfo image,x,y,,pitch,image
  pitch \= 4
  For k  = 0 To y-1
    For j  = 0 To x-1
      Asm
        'If k Then B = Image[ic - pitch] Else B = Image[ic]
        Xor ebx, ebx
        cmp [k], ebx
        cmovnz ebx, [pitch]
        mov eax, [ic]
        Sub eax, ebx
        Shl eax, 2
        mov ebx, [Image]
        add ebx, eax
        mov eax, [ebx]
        mov [B], eax
        'If k = y-1 Then H = Image[ic] Else H = Image[ic + pitch]
        Xor ebx, ebx
        mov ecx, [y]
        dec ecx
        cmp [k], ecx
        cmovnz ebx, [pitch]
        mov eax, [ic]
        add eax, ebx
        Shl eax, 2
        mov ebx, [Image]
        add ebx, eax
        mov eax, [ebx]
        mov [H], eax
      End Asm

      If j Then
        D = E
        E = F
      Else
        E = Image[ic]
        D = E
      EndIf
      If j < x-1 Then F = Image[ic + 1]
      If B <> H And D <> F Then
        Asm
          'If D = B Then Dest[dc] = D Else Dest[dc] = E
          mov eax, [D]
          cmp [B], eax
          cmovnz eax, [E]
          mov ecx, [dc]
          Shl ecx, 2
          mov ebx, [Dest]
          add ebx, ecx
          mov [ebx], eax
          'If B = F Then Dest[dc + 1] = F Else Dest[dc + 1] = E
          mov eax, [F]
          cmp [B], eax
          cmovnz eax, [E]
          mov [ebx+4], eax
          'If D = H Then Dest[dc + dp] = D Else Dest[dc + dp] = E
          mov eax, [D]
          cmp [H], eax
          cmovnz eax, [E]
          mov edx, [dp]
          Shl edx, 2
          add ebx, edx
          mov [ebx], eax
          'If H = F Then Dest[dc + dp +1] = F Else Dest[dc + dp +1] = E
          mov eax, [F]
          cmp [H], eax
          cmovnz eax, [E]
          mov [ebx+4], eax
        End Asm
      Else
        Asm
          mov eax, [E]
          mov ebx, [Dest]
          mov ecx, [dc]
          Shl ecx, 2
          add ecx, ebx
          mov [ecx], eax   'Dest[dc] = E
          mov [ecx+4], eax 'Dest[dc + 1] = E
          mov edx, [dp]
          Shl edx, 2
          add ecx, edx
          mov [ecx], eax   'Dest[dc + dp] = E
          mov [ecx+4], eax 'Dest[dc + dp +1] = E
        End Asm
      End If

      ic +=1
      dc +=2
    Next j
    ic = ic+pitch-x
    dc = dc+((dp-x)*2)
  Next k
End Sub

Viel Spaß damit
Volta


Attachments zum Code-Beispiel
QuelltextIScale2x_test.basIScale2x_test.basRedakteurVolta15.11.08

Zusätzliche Informationen und Funktionen
  • Das Code-Beispiel wurde am 15.11.2008 von RedakteurVolta angelegt.
  • Die aktuellste Version wurde am 16.11.2008 von RedakteurVolta gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen