Vielen Dank für die Hilfe,
Volker
"vsc...@gealan.com" wrote:
> ich kopiere per VBA Bilder in diverse Verzeichnisse und möchte gleich beim
> Kopieren die Auflösung, wenn größer als 800x600, auf diese Auflösung
> ändern.
> Besteht die Möglichkeit das ebenfalls über VBA zu realisieren?
vielleicht haben Sascha, Oliver oder Andre da was per API/GDI+, aber ich
nutze in solchen Faellen eher ein externes Tool wie Irfan, das man per Batch
ansteuern kann.
Gruss - Mark
--
Informationen fuer Neulinge in den Access-Newsgroups unter
http://www.doerbandt.de/Access/Newbie.htm
Bitte keine eMails auf Newsgroup-Beitraege senden.
"Mark Doerbandt" <spamre...@doerbandt.de> schrieb im Newsbeitrag
news:80AFA063-40CD-4762...@microsoft.com...
> Hallo, Volker,
>
> "vsc...@gealan.com" wrote:
>
>> ich kopiere per VBA Bilder in diverse Verzeichnisse und möchte gleich beim
>> Kopieren die Auflösung, wenn größer als 800x600, auf diese Auflösung
>> ändern.
>> Besteht die Möglichkeit das ebenfalls über VBA zu realisieren?
Ja.
>
> vielleicht haben Sascha, Oliver oder Andre da was per API/GDI+, ...
Gut geraten:
http://www.access-im-unternehmen.de/index1.php?id=300&BeitragID=337
Ciao, Sascha
Danke nochmals!
Volker
>> vielleicht haben Sascha, Oliver oder Andre da was per API/GDI+, ...
>
> Gut geraten:
> http://www.access-im-unternehmen.de/index1.php?id=300&BeitragID=337
sieht recht interessant und umfangreich aus, muss ich mir mal bei
Gelegenheit anschauen. Leider habe ich gerade keine Zeit, aber ich kann noch
ein kleines Beispiel mit gdi beisteuern. Da wird ein Screenshot erstellt,
das Bitmap auf 800 x 600 Pix geändert und in einem Image-Control angezeigt.
Der Vorgang findet im OnLoad-Event im Formular F01 statt.
http://www.gost2004.homepage.t-online.de/A00_ChangeResolution_1.zip
Gruss
Oliver
Ich hab mir jetzt den Code implementiert. Funktioniert soweit echt super!
Jedoch habe ich ein Problem, dass, wenn ich mehrer Bilder in einer Schleife
konvertieren möchte, die Bilder total verstümmelt sind, dh. es sieht aus wie
16 Farben und mit maximaler Kompression (nur grobe Artefakte). Die Bildinfo
jedoch gibt an dass das Bild 16 Mill. Farben hat.
Wie gesagt tritt das Problem nur in einer Schleife auf. Wenn ich die Bilder
einzeln abarbeite, dann ist alles i.O (Übergabeparameter sind also o.k.)..
Ich habe alles in meinem bescheidenen Wissen zur Verfügung stehende schon
probiert, aber ich bekomme es einfach nicht gebacken.
Anbei mal der Codeausschnitt, Vielleicht kannst du ja etwas entdecken:
++++++++++
Private Sub cmdUpload_Click()
DoCmd.Hourglass True
Dim strQuelle As String, strZiel As String, PSizeY As Long, PSizeX As Long,
NewSizeY As Long
On Error GoTo HandleErr
Dim rsFFS As New ADODB.Recordset
Set rsFFS = New ADODB.Recordset
rsFFS.Open "tab_fuellstudie", CurrentProject.Connection, adOpenKeyset,
adLockOptimistic
For i = 0 To Me!lblQuelle.ListCount - 1
With rsFFS
strQuelle = Me.lblQuelle.ItemData(i)
strZiel = Me.lblServerZiel & Me.lblNeuerName & i + 1 & ".JPG"
If (Dir(strZiel) <> "") = True Then
Dim RetFileCopy As String
RetFileCopy = FormatMsgBox("Hinweis@Die Datei '" & strZiel & "'
exisitiert bereits!@" & _
"Möchten Sie die Datei überschreiben?",
vbQuestion + vbYesNo + vbDefaultButton2, "AMS fragt...")
If RetFileCopy = vbNo Then GoTo ExitHere
End If
If Me!ctrlResample = True Then
PSizeX = GetDimensionsGDIP(LoadPictureGDIP(strQuelle)).X
PSizeY = GetDimensionsGDIP(LoadPictureGDIP(strQuelle)).Y
NewSizeY = Format$(PSizeY / (PSizeX / 640), "#0")
SavePicGDIPlus ResampleGDIP(LoadPictureGDIP(strQuelle), 640,
NewSizeY), strZiel, PicTypeJPG
Else
FileCopy strQuelle, strZiel
End If
.AddNew
!fuell_muster_id = Me!lblMNr
!fuell_pfad = strZiel
!fuell_wznr_muster = Forms!form_bemusterungsprotokoll!WzNr
!fuell_lfdnr_muster = Forms!form_bemusterungsprotokoll!LfdNr
!fuell_artnr_muster = Forms!form_bemusterungsprotokoll!artnr
!fuell_lfdNr = i
!fuell_user = UserVar
!fuell_date = Now()
.Update
End With
Application.Echo False, "Bild Nr." & i + 1 & " kopiert"
Next i
DoCmd.Hourglass False
FormatMsgBox "Hinweis@Bilder erfolgreich kopiert!@", vbInformation, "AMS
sagt..."
DoCmd.Close acForm, Me.Name
ExitHere:
If rsFFS.State = adStateOpen Then rsFFS.Close
Set rsFFS = Nothing
DoCmd.Hourglass False
Application.Echo True
Exit Sub
HandleErr:
Select Case Err.Number
Case Else
Dim ErrDesc As String, ErrNum As String
ErrDesc = Err.Description
ErrNum = Err.Number
ErrLog ErrDesc, ErrNum,
"Form_frm_bilder_kopieren.cmdUpload_Click"
FormatMsgBox "Fehler!@Nummer: " & ErrNum & "@" &
ErrDesc, vbCritical, "Form_frm_bilder_kopieren.cmdUpload_Click"
End Select
GoTo ExitHere
' Ende des Fehlerbehandlungsblocks.
End Sub
++++++++++
Vielen Dank im Vorraus,
Volker
"Sascha Trowitzsch" schrieb > Hi,
>
> "Mark Doerbandt" schrieb im Newsbeitrag
Ändere mal die Prozedurdeklaration von SavePicGDIPlus:
Function SavePicGDIPlus(ByVal Image As StdPicture, _
sFile As String, _
PicType As PicFileType, _
Optional Quality As Long = 80) As Boolean
...Also Quality As Long statt Byte. Byte ist falsch.
Ich denke, dass es daran liegt.
Ciao, Sascha
"Volker Scherf" <vsc...@online.de> schrieb im Newsbeitrag
news:g5favs$apl$1...@online.de...
Du bist eben a Hund.
;)
Wie machst du das nur?
Mich würde es aber dennoch interessieren warum es mit Byte in dieser
Schleife nicht funktioniert?
Vielen Dank nochmals!
Volker
"Sascha Trowitzsch" <n...@moss-soft.de> schrieb im Newsbeitrag
news:uB7rL1a5...@TK2MSFTNGP03.phx.gbl...
"Volker Scherf" <vsc...@online.de> schrieb im Newsbeitrag
news:g5hm9i$tp$1...@online.de...
> Hallo Sascha,
> was soll ich sagen.
> Funktioniert bestens!
>
> Du bist eben a Hund.
> ;)
> Wie machst du das nur?
>
> Mich würde es aber dennoch interessieren warum es mit Byte in dieser Schleife
> nicht funktioniert?
Das allerdings wüsste ich auch gerne.
Ich kenne den Fehler durchaus, weil bereits früher Leute den Bug meldeten und
ich meine neueren GDI+-Module längst umstellte. Aber entweder tritt die Quality
=0 grundsätzlich mit der Prozedur auf, oder gar nicht, nicht aber mal nicht, mal
schon, wie offensichtlich bei dir.
An GDI+ wird für den JPEG-Encoder der Wert des Quality-Parameters ja per
VarPtr() übergeben. Also ein Zeiger auf die Variable, nicht deren Inhalt. Wenn
die Variable vom Type Byte ist, dann liest GDI+ dennoch einen Long-Wert vom
Zeiger und bekommt damit ein unbestimmtes Ergebnis: Statt etwa 80 wird dann über
die Byte-Grenze hinaus gelesen und, je nachdem, was in diesem undefinierten
Speicherbereich steht, wohl meist noch drei Nullen erhalten. Wegen der Bytefolge
eines Long (BigEndian) steht Quality damit auf 0 und die JPEG-Komprimierung ist
maximal und höchst verlustbehaftet.
Ciao, Sascha