![]() |
Anzeige:
|
|
|||||||
| Dlls, Includes, Units & Prozeduren Alles zu den Themen Dlls, Includes, Units & Prozeduren |
|
![]() |
|
|
LinkBack | Themen-Optionen | Ansicht |
|
|
#1 (Direktlink) |
|
Erfolgreich angemeldet
![]() Registriert seit: 13.01.2010
Beiträge: 5
|
Habe für eine alte Version von Prospeed.dll eine Prozedur zum Drehen und Einpassen eines Bildes geschrieben. Doch mit der neuen Version geht die nicht mehr. Leider bin ich beim Umsetzen in den neuen Code gescheitert. Kann mit jemand helfen?
Hier ist der Code für die Prozedur für die alte Prospeed.dll Version. Die Prozedur zeichnet ein Bild in ein vorgegebenes Rechteck und dreht es beim Drucken um 90 grad, was mit dem Parameter drk% gesteuert wird. Code:
Proc BildAnz
parameters BDatei$, Bx&, By&, BreitX&, BreitY&, Drk%
declare BQuelle&, BBreite&, BHoehe&, neubreit&, neuhoch&
declare neubreitx&, neuhochy&, DrkKlein&, DrkBild&
declare Faktor%
let Faktor% = 10
BQuelle&=LoadExtImage(addr(BDatei$))
ifnot equ(BQuelle&,0)
BBreite& = GetBmpWidth(BQuelle&) 'Breite und Hoehe des Bildes
BHoehe& = GetBmpHeight(BQuelle&) 'ermitteln
' messagebox(Str$(BBreite&),Str$(BHoehe&),0)
if gt(BBreite& / BHoehe& , BreitX& / BreitY&)
neubreit& = BreitX&
neuhoch& = BHoehe&/BBreite&*neubreit&
else
neuhoch& = BreitY&
neubreit& = BBreite&/BHoehe&*neuhoch&
endif
if drk%
let neuhoch& = neuhoch& * Faktor%
let neubreit& = neubreit& * Faktor%
DrkKlein&=CreateExtBmp(%HDC,neubreit&,neuhoch&)
SizeExtBmp (DrkKlein&,0,0,neubreit&,neuhoch&,BQuelle&,0,0,BBreite&,BHoehe&,0)
DrkBild&=CreateExtBmp(%HDC,neuhoch&,neubreit&)
' Die automatische Zentrierung beim Rotieren ausgleichen
If neubreit&>=neuhoch&
neubreitx&=(neubreit&-neuhoch&)/2
Else
neubreitx&=(neuhoch&-neubreit&)/2
EndIf
neuhochy&=neubreitx&
Case neubreit&>neuhoch&:neubreitx&=-neubreitx&
Case neuhoch&>neubreit&:neuhochy&=-neuhochy&
RotateExtBmp(DrkBild&,neubreitx&,neuhochy&,neubreit&,neuhoch&,DrkKlein&,0,0,90,0)
let Bx& = Bx& * Faktor%
let By& = By& * Faktor%
CopyExtBmp(%hdc,Bx&,By&,neuhoch&,neubreit&,DrkBild&,0,0,0)
else
SizeExtBmp (%hdc,Bx&,By&,neubreit&,neuhoch&,BQuelle&,0,0,BBreite&,BHoehe&,0)
endif
endif
FreeAllExtBmps()
endproc
|
|
|
|
|
|
|
#2 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.091
|
Schau mal in die Datei Anleitung/Was ist neu.pdf. Viele Funktionsnamen waren zum Schluss irreführend, wie z.B. CreateExtBmp(). Dieses kann viel mehr als nur Bmp-Daten erstellen, darum heisst die Funktion jetzt CreateImage(). Von der neuen Namengebung sind noch andere Funktionen betroffen, einige wurden auch komplett abgeschafft.
Folgende Funktionen wurden in Version 3.0 komplett abgeschafft: BmpToPsf, BreakOn, BreakOff, CDDoor GetPsfFileSize, LoadExtBmp, PsfFileName, PsfToBmp Folgende Funktionen wurden umbenannt in Version 3.0: CloneFX (vorher CloneArray) CopyFX (vorher CopyArray) PaintImage (vorher CopyExtBmp) CreateImage (vorher CreateExtBmp) CreateFX (vorher CreateExtFX) ColorFillImage (vorher FillExtBmp) ColorFill (vorher FillFX) FreeAllImages (vorher FreeAllExtBmps) FreeImage (vorher FreeExtBmp) FreeFX (vorher FreeExtFX) Merge (vorher Fuse) GetHeightImage (vorher GetBmpHeight) GetInfosImage (vorher GetBmpInfos) GetWidthImage (vorher GetBmpInfos) InitFX (vorher InitExtFX) LoadFileImage (vorher LoadExtImage) LoadMemoryImage (vorher LoadExtMemory) LoadResourceImage (vorher LoadExtResource) RotateImage (vorher RotateExtBmp) SaveFX (vorher Save) SaveImage (vorher SaveExtFX) SaveToMemoryFX (vorher SaveToMemory) SizeImage (vorher SizeExtBmp) Folgende Funktionen wurden in Version 3.0 erweitert oder erneuert: AlphaTrans, Water Anhand der Auflistung sollte es dir ein leichtes seine, deinen Code im Editor per Suchen/Ersetzen rundzuerneuern.
__________________
Gruß, Frank ![]() Webpage http://frabbing.bplaced.net mit Freeware - Tools, Spiele und Grafiken. |
|
|
|
|
|
#3 (Direktlink) |
|
Erfolgreich angemeldet
![]() Registriert seit: 13.01.2010
Beiträge: 5
|
Hallo Frank,
vielen Dank für die schnelle Antwort und die Hilfe, aber leider schaffe ich es alleine einfach nicht. Ich habe alles versucht, die Befehle zu ersetzen. Das Problem ist, das Bild dreht sich bei mir einfach nicht. Hier ist mein gescheiterter Versuch der Umsetzung des Drehens um 90 Grad. Das Problem habe ich so weit wie möglich isoliert. Bitte wirf doch mal kurz einen Blick auf den Code, ob dir ein Fehler auffällt. Viele Grüße Bernd Code:
declare text$,neu&,Bild&,Hintergrund&,array1&,array2&,X&,Y&, neuX&, neuY&
Def GetSysColor(1) !"USER32","GetSysColor"
SetTrueColor 1
windowstyle 26
Window 0,0-1024,700
cls GetSysColor(15)
$I Prospeed_Funktionen.inc
neu&=usedll("ProSpeed.dll")
' *** Bild laden, das rotiert werden soll
text$="BspBild2.jpg"
Bild&=LoadFileImage(addr(text$))
X&=GetWidthImage(Bild&)
Y&=GetHeightImage(Bild&)
hintergrund&=CreateImage(%HDC,X&,Y&)
' Die automatische Zentrierung beim Rotieren ausgleichen
If X&>=Y&
neuX&=(X&-Y&)/2
Else
neuX&=(Y&-X&)/2
EndIf
neuY&=neuX&
Case X&>Y&:neuX&=-neuX&
Case Y&>X&:neuY&=-neuY&
PaintImage(hintergrund&,neuX&,neuY&,X&,Y&,hintergrund&,0,0,14)
' *** Beide Bilder in Arrays umwandeln
array1&=InitFX(hintergrund&)
array2&=InitFX(Bild&)
Rectangle 19,19-21+Y&,21+X&
Rotate(%HDC,neuX&,neuY&,array1&,array2&,90,0)
PaintImage(%HDC,neuX&,neuY&,X&,Y&,Bild&,0,0,0)
waitinput
' *** Byte-Array's wieder löschen
'
FreeFX(array1&)
FreeFX(array2&)
FreeImage(Bild&)
FreeImage(Hintergrund&)
freedll neu&
End
|
|
|
|
|
|
#4 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.091
|
Hallo Bernhardus,
schau mal den Code: Code:
declare text$,neu&,Bild&,arbeitsbild&,Hintergrund&,array1&,array2&,X&,Y&,z&,neuX&,neuY&
Def GetSysColor(1) !"USER32","GetSysColor"
SetTrueColor 1
windowstyle 26
Window 0,0-1024,700
cls GetSysColor(15)
$I Prospeed_Funktionen.inc
neu&=usedll("ProSpeed.dll")
' *** Bild laden, das rotiert werden soll
text$="al1.gif"
arbeitsbild&=LoadFileImage(addr(text$))
X&=GetWidthImage(arbeitsbild&)
Y&=GetHeightImage(arbeitsbild&)
z&=x&
case y&>x&:z&=y&
bild&=CreateImage(%HDC,z&,z&)
PaintImage(bild&,((z&/2)-(x&/2)),((z&/2)-(y&/2)),x&,y&,arbeitsbild&,0,0,0)
FreeImage(arbeitsbild&)
hintergrund&=CreateImage(%HDC,z&,z&)
PaintImage(hintergrund&,0,0,z&,z&,%hdc,0,0,0)
' *** Beide Bilder in Arrays umwandeln
Whileloop 30
array1&=InitFX(hintergrund&)
array2&=InitFX(Bild&)
Rotate(bild&,0,0,array1&,array2&,90,-1)
PaintImage(%hdc,0,0,z&,z&,bild&,0,0,0)
FreeFX(array1&)
FreeFX(array2&)
Sleep 150
EndWhile
waitinput
FreeImage(Bild&)
FreeImage(Hintergrund&)
freedll neu&
End
Du solltest bei Rotate() auch den Kopiermodus beachten. Wenn du nicht transparent drehst, wird auch dein Hintergrund bemalt. In Fall von überflüssigen Randinfos eben schwarz. Ich weiss, die Grafikarrays sind mitunter nicht einfach zu verstehen. Wenn man aber den Bogen mal raus hat, kann man damit echte Wunder bewirken. Schau dir mal das ProSpeed-Demo \Demos & Sourcecodes (AutoIt)\fx-autoit-prospeed-megademo\fx-imagedemo.exe an. Du wirst staunen... P.S.: Den schwarzen Rahmen hatte ich jetzt nicht weiter beachtet, weil ich nicht genau wusste, was du damit anstellen willst. Ich empfehle dir aber, ihn nach dem laden des Bilds einfach direkt in das Bild zu zeichnen!
__________________
Gruß, Frank ![]() Webpage http://frabbing.bplaced.net mit Freeware - Tools, Spiele und Grafiken. Geändert von Frabbing (15.01.2010 um 17:38 Uhr) |
|
|
|
|
|
#5 (Direktlink) |
|
Erfolgreich angemeldet
![]() Registriert seit: 13.01.2010
Beiträge: 5
|
Hallo Frank,
Vielen Dank für dieses einfachere Beispiel. Ok, diesen Code kann ich wahrscheinlich verstehen, nachbauen und auf meine Bedürfnisse anpassen, wenn ich mich länger damit beschäftige. Aber ein Problem habe ich noch, bevor ich damit anfangen kann, wobei ich das Problem auch schon mit dem Beispielprogramm der neuen Prospeed.dll hatte: Der Code funktioniert wunderbar mit relativ quadratischen Bildern (z. B. 300*296 Pixel). Wenn das Bild aber eine deutlich größere Breite als Höhe hat (z. B. 285*141 Pixel), dann passiert etwas ganz seltsames: Das Bild ist nach dem Drehen nur noch schwarz weiß und es ist auch nicht ganz 90 Grad gedreht sondern schräg und teilweise versetzt, obwohl 90 grad im Code eingestellt sind. Relativ quadratische Bilder können einwandfrei mit demselben Code gedreht werden . Kannst du das erklären? Vielen Dank im Voraus für deine Mühe. Viele Grüße Bernd |
|
|
|
|
|
|
#6 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.091
|
Ja, das kann ich erklären. Du solltest keine Bilder verwenden mit z.B. der Größe 285*141.
Die Breite eines Bilds für ein Grafik-Array sollte immer eine Breite besitzen, die glatt durch 4 teilbar ist. In deinem Fall also 284*141, bzw. 288*141. Grund ist, dass bei nicht-glatt-durch-vier-teilbaren Breiten (von Windows) zusätzliche Bytes in das Bild einbaut sind, welche einen Effekt langsamer machen, weil eben diverse Abfragen nötig wären. Darum erwartet ProSpeed bei der Bildbreite diese Sonderbehandlung. Deine Grafik war schlichtweg durch die Zusatzbytes in den Farben und in der Zusammensetzung verschoben.
__________________
Gruß, Frank ![]() Webpage http://frabbing.bplaced.net mit Freeware - Tools, Spiele und Grafiken. |
|
|
|
|
|
#7 (Direktlink) |
|
Erfolgreich angemeldet
![]() Registriert seit: 13.01.2010
Beiträge: 5
|
Das war es, vielen Dank. Ich habe zwar den Hinweis mit der durch 4 teilbaren Breite gelesen, konnte es aber nicht richtig umsetzen.
Den Code von dir habe ich etwas modifiziert: Mit folgendem Code kann man jede Bilddatei drehen, da die Breite des Bildes vor der Drehung ggf. einfach entsprechend durch eine leuchte Zerrung mit Sizeimage verringert wird. Wenn jemand eine bessere Idee hat, wie man es umsetzen kann, dass jede beliebige Datei gedreht werden kann, wäre ich dankbar. (Besser wäre meiner Meinung nach z. B., wenn das Programm die entsprechenden Pixel abschneiden würde, statt das Bild zu zerren, das konnte ich aber nicht realisieren.) Gruß Bernd Hier der Code: Code:
declare text$,neu&,Bild&,arbeitsbild&,Hintergrund&,array1&,array2&,X&,Y&,z&,neuX&,neuY&
declare Ladebild&, XLad&
Def GetSysColor(1) !"USER32","GetSysColor"
SetTrueColor 1
windowstyle 26
Window 0,0-1024,700
cls GetSysColor(15)
$I Prospeed_Funktionen.inc
neu&=usedll("ProSpeed.dll")
' *** Bild laden, das rotiert werden soll
text$="BSPBild.jpg"
Ladebild&=LoadFileImage(addr(text$))
XLad&=GetWidthImage(Ladebild&)
Y&=GetHeightImage(Ladebild&)
' *** Ggf. Breite des Ladebildes durch 4 teilbar machen
if XLad& mod 4 <> 0
let x&=xLad&-(XLad& mod 4)
arbeitsbild&=CreateImage(%HDC,x&,y&)
SizeImage (arbeitsbild&,0,0,x&,y&,Ladebild&,0,0,x&,y&,0)
else
arbeitsbild&=LoadFileImage(addr(text$))
X&=GetWidthImage(arbeitsbild&)
endif
z&=x&
case y&>x&:z&=y&
bild&=CreateImage(%HDC,z&,z&)
PaintImage(bild&,((z&/2)-(x&/2)),((z&/2)-(y&/2)),x&,y&,arbeitsbild&,0,0,0)
FreeImage(arbeitsbild&)
hintergrund&=CreateImage(%HDC,z&,z&)
PaintImage(hintergrund&,0,0,z&,z&,%hdc,0,0,0)
' *** Beide Bilder in Arrays umwandeln
Whileloop 30
array1&=InitFX(hintergrund&)
array2&=InitFX(Bild&)
Rotate(bild&,0,0,array1&,array2&,90,-1)
PaintImage(%hdc,0,0,z&,z&,bild&,0,0,0)
FreeFX(array1&)
FreeFX(array2&)
Sleep 150
EndWhile
waitinput
Freeimage(arbeitsbild&)
Freeimage(Ladebild&)
FreeImage(Bild&)
FreeImage(Hintergrund&)
freedll neu&
End
Geändert von Bernhardus (17.01.2010 um 10:27 Uhr) |
|
|
|
|
|
#8 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.091
|
Hast du ein Bild von z.B. 83x60, kannst du es ja jederzeit in einen zusätzlichen DC kopieren, in dem Fall einen mit der Größe 80x60. Oder du benutzt eben deine Variante, beide sind überall so üblich.
__________________
Gruß, Frank ![]() Webpage http://frabbing.bplaced.net mit Freeware - Tools, Spiele und Grafiken. |
|
|
|
|
|
#9 (Direktlink) |
|
Erfolgreich angemeldet
![]() Registriert seit: 13.01.2010
Beiträge: 5
|
Hallo Frank,
stimmt, man braucht gar nicht sizeimage sondern kann mit Paintimage die überflüssigen Pixel abscheiden. Etwa so Code:
Ladebild&=LoadFileImage(addr(text$)) XLad&=GetWidthImage(Ladebild&) Y&=GetHeightImage(Ladebild&) ' *** Ggf. Breite des Ladebildes durch 4 teilbar machen if XLad& mod 4 <> 0 let x&=xLad&-(XLad& mod 4) arbeitsbild&=CreateImage(%HDC,x&,y&) PaintImage (arbeitsbild&,0,0,x&,y&,Ladebild&,0,0,0) else arbeitsbild&=LoadFileImage(addr(text$)) X&=GetWidthImage(arbeitsbild&) endif Viele Grüße Bernd |
|
|
|
|
|
#10 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.091
|
__________________
Gruß, Frank ![]() Webpage http://frabbing.bplaced.net mit Freeware - Tools, Spiele und Grafiken. |
|
|
|
|
![]() |
|
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Bilder drehen | recado | Software - Allgemein | 6 | 05.11.2009 16:22 |
| ProSpeed.dll mit SizeImage Bilder verkleinern und speichern ? | Unregistriert | Dlls, Includes, Units & Prozeduren | 1 | 25.04.2009 15:42 |
| Bereich einlesen mit Prospeed | profanfan | Helfer & Tools | 9 | 10.03.2009 16:53 |
| Prospeed 3.0 komplett mit Beispiel | profanfan | Helfer & Tools | 15 | 09.03.2009 22:22 |
| ProSpeed.dll - Version 3.0 | Frabbing | Dlls, Includes, Units & Prozeduren | 1 | 07.03.2009 22:16 |