Dialog Ausschneiden (VBS)

Der Dialog gehört zu den Multidialogen. Er wird aufgerufen mit:

  1. FF_MultiDialog "MultiCanvas",2

Um eine Information über den Ablauf zu erhalten, beispielsweise ob der Dialog abgebrochen wurde, kann der Dialog auch wie folgt aufgerufen werden:

  1. Dim Antwort
  2.  
  3. Antwort = FF_MultiDialog ("MultiCanvas",2)
  4. if Antwort < 0 then
  5. msgbox "Das Bild wurde nicht beschnitten!",vbInformation,"Hinweis"
  6. end if

Die genauen Rückgabewerte sind:

  1. 1 = nichtspezifizierter Fehler
  2. 2 = Abbruch

Will man Schnittmarken vorgeben, ist das und weiteres mit FF_SetParam möglich:

  1. Dim Antwort,Array
  2.  
  3. Dim SchnittabstandX,SchnittabstandY
  4. Dim Schnittbreite,Schnitthoehe
  5. Dim Bildbreite,Bildhoehe
  6. Dim Markierung,Proportional
  7.  
  8. 'Beispielswerte
  9. Schnittbreite = 800
  10. Schnitthoehe = 600
  11. Bildbreite = FF_GetImageWidth
  12. Bildhoehe = FF_GetImageHeight
  13. Markierung = 0 'Erläuterung siehe unten '### Markierungsauswahl
  14. Proportional = 1 '0 bedeutet 'nicht proportional'
  15.  
  16. '### Markierungsauswahl (bis Version 3.02.24 - nur zur Erläuterung):
  17. '0 - Markierung "Aus", Beschnitt nicht proportional (hier nicht zulässig)
  18. '1 - Markierung "Goldener Schnitt", Beschnitt proportional
  19. '2 - Markierung "Drittel", Beschnitt proportional
  20. '3 - Markierung "Deutschland ab 10", Beschnitt proportional
  21. '4 - Markierung "Deutschland bis 9", Beschnitt proportional
  22. '5 - Markierung "Aus", Beschnitt proportional
  23.  
  24. '### Markierungsauswahl (ab Version 3.02.25 - nur zur Erläuterung):
  25. '0 - Markierung "Aus"
  26. '1 - Markierung "Goldener Schnitt"
  27. '2 - Markierung "Goldene Spirale l. ob."
  28. '3 - Markierung "Goldene Spirale r. ob."
  29. '4 - Markierung "Goldene Spirale r. un."
  30. '5 - Markierung "Goldene Spirale l. un."
  31. '6 - Markierung "Drittel"
  32. '7 - Markierung "Deutschland ab 10"
  33. '8 - Markierung "Deutschland bis 9"
  34.  
  35. 'Berechnung der Schnittabstände, wenn die Markierung mittig sein soll
  36. SchnittabstandX = int((Bildbreite - Schnittbreite) / 2) '| erst ab Version 3.10.23 kann der Schnittabstand als x- und y-Wert vorgegeben werden
  37. SchnittabstandY = int((Bildhoehe - Schnitthoehe) / 2) '| bis dahin werden die Schnittmarkierungen immer mittig angeordnet
  38.  
  39. 'Beschnitt
  40. FF_SetParam SchnittabstandX & "," & SchnittabstandY & "," & Schnittbreite & "," & _
  41. Schnitthoehe & "," & Bildbreite & "," & Bildhoehe & "," & Markierung & "," & Proportional
  42. Antwort = FF_MultiDialog ("MultiCanvas",2)
  43. if Antwort < 0 then
  44. msgbox "Das Bild wurde nicht beschnitten!",vbInformation,"Hinweis"
  45. else
  46. msgbox "Das Bild wurde erfolgreich beschnitten!",vbInformation,"Hinweis"
  47. FF_Reload
  48. end if
  49.  
  50. 'Ermittlung der benutzten Markierung
  51. Array = split(FF_GetParam,",")
  52. Markierung = Array(6)
  53. msgbox "Der benutzte Markierungscode ist " & Markierung,vbInformation,"Hinweis"

Nach Durchführung des Beschnitts kann man mit FF_GetParam die benutzten Einstellungen des Dialogs ermitteln, z.B. welche Markierung verwendet wurde (siehe Ende des Beispielcodes).

Ein Problem mit dem Dialog Ausschneiden gibt es, wenn ein querformatiger Beschnitt bei einem hochformatigen Bild oder ein hochformatiger Beschnitt bei einem querformatigen Bild erfolgen soll. Schnittbreite und Schnitthöhe müssen dann vertauscht werden und der Benutzer muss darauf hingewiesen werden, dass er im Dialog die Taste "Hoch/Quer" betätigen muss.

Der Tausch und der Hinweis kann durch folgenden Code erzeugt werden, der vor dem Absatz

  1. 'Beschnitt
  2. eingefügt werden muss:
  3.  
  4. 'wenn Hochformat aus Querformat oder Querformat aus Hochformat geschnitten werden soll
  5. if (Schnittbreite > Schnitthoehe) Xor (Bildbreite > Bildhoehe) then
  6. 'Tausch
  7. Dim B_temp
  8. B_temp = Schnittbreite
  9. Schnittbreite = Schnitthoehe
  10. Schnitthoehe = B_temp
  11. 'Hinweis
  12. msgbox "Bitte im folgenden Dialog die Taste 'Hoch/Quer' betätigen!",vbInformation,"Unbedingt beachten!"
  13. end if

Dieses Problem ist lt. JKS historisch auf eine Forderung der Forumsmitglieder zurück zu führen (siehe Antwort von JKS).

Bis zu einer Lösung kann der Trick angewendet werden die Bildfläche bei Bedarf so zu vergrößern, dass das Bildformat dem Schnittformat entspricht. Dafür wird das Bild zur Erzeugung eines Hochformats nach unten oder zur Erzeugung eines Querformats nach rechts erweitert. Der Code sieht dann so aus:

  1. Dim Antwort,Array
  2.  
  3. Dim SchnittabstandX,SchnittabstandY
  4. Dim Schnittbreite,Schnitthoehe
  5. Dim Bildbreite,Bildhoehe
  6. Dim Markierung,Proportional
  7.  
  8. 'Beispielswerte
  9. Schnittbreite = 800
  10. Schnitthoehe = 600
  11. Bildbreite = FF_GetImageWidth
  12. Bildhoehe = FF_GetImageHeight
  13. Markierung = 0 'Erläuterung siehe oben '### Markierungsauswahl
  14. Proportional = 1 '0 bedeutet 'nicht proportional'
  15.  
  16. 'Berechnung der Schnittabstände, wenn die Markierung mittig sein soll
  17. SchnittabstandX = int((Bildbreite - Schnittbreite) / 2) '| erst ab Version 3.10.23 kann der Schnittabstand als x- und y-Wert vorgegeben werden
  18. SchnittabstandY = int((Bildhoehe - Schnitthoehe) / 2) '| bis dahin werden die Schnittmarkierungen immer mittig angeordnet
  19.  
  20. 'wenn Hochformat aus Querformat oder Querformat aus Hochformat geschnitten werden soll,
  21. 'wird das Bild um eine rote Fläche so erweitert, dass das Bildformat dem Schnittformat entspricht.
  22. if (Schnittbreite > Schnitthoehe) Xor (Bildbreite > Bildhoehe) then
  23. msgbox "Im folgenden Dialog die rote Erweiterungsfläche nicht in den Schnitt einbeziehen!",vbExclamation,"Hinweis"
  24. if (Schnittbreite > Schnitthoehe) then
  25. FF_ExtendCanvas 0,Bildhoehe-Bildbreite+1,0,0,255,0,0
  26. Bildbreite = Bildhoehe+1
  27. else
  28. FF_ExtendCanvas 0,0,0,Bildbreite-Bildhoehe+1,255,0,0
  29. Bildhoehe = Bildbreite+1
  30. end if
  31. end if
  32.  
  33. 'Beschnitt
  34. FF_SetParam SchnittabstandX & "," & SchnittabstandY & "," & Schnittbreite & "," & _
  35. Schnitthoehe & "," & Bildbreite & "," & Bildhoehe & "," & Markierung & "," & Proportional
  36. Antwort = FF_MultiDialog ("MultiCanvas",2)
  37. if Antwort < 0 then
  38. msgbox "Das Bild wurde nicht beschnitten!",vbInformation,"Hinweis"
  39. else
  40. msgbox "Das Bild wurde erfolgreich beschnitten!",vbInformation,"Hinweis"
  41. FF_Reload
  42. end if
  43.  
  44. 'Benutzte Markierung nach dem Beschneiden ermitteln:
  45. Array = split(FF_GetParam,",")
  46. Markierung = Array(6)
  47. msgbox "Der benutzte Markierungscode ist " & Markierung,vbInformation,"Hinweis"

Leider gibt es noch ein Problem mit quadratischen Ausschnitten (siehe dazu diese Fehlermeldung )