Code-Beispiel
ImageScale2x
Lizenz: | Erster Autor: | Letzte Bearbeitung: |
GPL | Volta | 16.11.2008 |
ImageScale2x ist eine bewertete Vergrößerung von Bildpunkten (Pixel) nach dem Verfahren wie es Andrea Mazzoleni hier beschreibt:
http://scale2x.sourceforge.net/algorithm.html
Es eignet sich um kleine Icons ohne starke Rasterung zu Vergrößern.

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 |
---|
|
Zusätzliche Informationen und Funktionen |
- Das Code-Beispiel wurde am 15.11.2008 von
Volta angelegt.
- Die aktuellste Version wurde am 16.11.2008 von
Volta gespeichert.
|
|