Seite 1 von 1

JPG Auflösung automatisch herabsetzen

Verfasst: Di, 06. Dez 2016 9:37
von UliTs
Hallo allerseits,

auf Lieferscheine sollen von den Artikeln erscheinen. Und zwar nicht einfach ein Foto je Artikel hinterlegt werden sondern für jeden Lieferschein ein neues Foto gemacht werden.
Wie mache ich das am geschicktesten?
a) Foto kommt irgendwie als JPG auf den Rechner
b) Foto wird in der Lieferscheintabelle gespeichert

Nun möchte ich nicht gerade 10MB-Fotos dort speichern. Deshalb die Frage:
wenn der Anwender so ein Foto speichern will: wie kann ich das Foto (automatisch) so bearbeiten, dass der Speicherbedarf drastisch sinkt? z.B. von 8000x6000 auf 400x300 Punkte verkleinern?

Uli

Re: JPG Auflösung automatisch herabsetzen

Verfasst: Di, 06. Dez 2016 10:28
von brandelh
Jimmy hatte mir damals bei meiner Uhr geholfen, da wird ein Bild scaliert GraBitBlt() ist meine ich der Name der Funktion.

Schau mal hier:

:arrow: http://www.xbaseforum.de/viewtopic.php?f=16&t=2556

Re: JPG Auflösung automatisch herabsetzen

Verfasst: Di, 06. Dez 2016 11:39
von UliTs
Danke. Habe mir auf die Schnelle die Funktion angeschaut.
Ich bin mir aber nicht sicher, ob sie nicht nur zur Auswahl eines Ausschnittes dient.

Re: JPG Auflösung automatisch herabsetzen

Verfasst: Di, 06. Dez 2016 12:13
von brandelh
Aus dem Gedächtnis meine ich dass Die einen Ausschnitt (oder alles ) in eine neue Größe oder auch verdreht umwandeln kann.
Dann abspeichern. Jimmy hatte auch noch eine Funktion genannt, aber meine Uhr zeigt auch größere Grafiken skaliert an, warum sollte das die nicht auch speichern können.

Re: JPG Auflösung automatisch herabsetzen

Verfasst: Di, 06. Dez 2016 13:34
von peternmb
So funktioniert es bei mir per Funktion:

Code: Alles auswählen

modJPG("Test_gross.JPG","Test_klein.JPG",100,100)

proc modJPG(orgJPG,neuJPG,breit,hoch)      // = neue Abmessungen
  LOCAL oPSA1 := xbpPresSpace():New():Create(), ;
        oPSA2 := xbpPresSpace():New():Create(), ;
        oBmpA1,oBmpA2, ok:=.F.
  //  
  oBmpA1 := xbpBitmap():New():Create()
  oBmpA1:PresSpace(oPSA1)
  oBmpA1:LoadFile(orgJPG) 
  //
  oBmpA2 := xbpBitmap():New():Create()
  oBmpA2:PresSpace(oPSA2)
  oBmpA2:Make(breit,hoch)
  //
  aS1 := {0,0,oBmpA1:xSize,oBmpA1:ySize}
  aS2 := {0,0,oBmpA2:xSize,oBmpA2:ySize}
  GraBitBlt(oBmpA2:PresSpace(),oBmpA1:PresSpace(),aS2,aS1,,GRA_BLT_BBO_IGNORE,Sleep(0.1))
  //
  if oBmpA2:SaveFile(neuJPG,XBPBMP_FORMAT_JPG,0)  //  Bild-Datei schreiben 
    ok= .T.
  endif
  //       
  oBmpA1:destroy()
  oBmpA2:destroy() 
  //
  oPSA1:destroy()
  oPSA2:destroy()
  //
return

Re: JPG Auflösung automatisch herabsetzen

Verfasst: Di, 06. Dez 2016 14:47
von UliTs
Hallo PeterNmb,

vielen Dank. Das sieht gut aus!

Uli

Re: JPG Auflösung automatisch herabsetzen

Verfasst: Di, 06. Dez 2016 15:30
von brandelh
Die Funktion sollte in die Wissensdatenbank :-)

PS: die kratze ich mir auch gleich :-)

Re: JPG Auflösung automatisch herabsetzen

Verfasst: Di, 06. Dez 2016 22:48
von AUGE_OHR
peternmb hat geschrieben:

Code: Alles auswählen

 GraBitBlt(oBmpA2:PresSpace(),oBmpA1:PresSpace(),aS2,aS1,,GRA_BLT_BBO_IGNORE,Sleep(0.1))
hm ... was soll das SLEEP(0.1) als 7th Parameter in der Function bewirken wenn es nur 6 Parameter gibt ?

die Function von mir heisst übrigens BMP2BMP()

Re: JPG Auflösung automatisch herabsetzen

Verfasst: Mi, 07. Dez 2016 11:24
von peternmb
hm ... was soll das SLEEP(0.1) als 7th Parameter in der Function bewirken wenn es nur 6 Parameter gibt ?
die Function von mir heisst übrigens BMP2BMP()
Diese Funktion ist mit Sicherheit hier aus dem Forum, vermutlich von Jimmy.
Ich habe auch die richtige Skalierung für den Beispielcode der Übersichtlichkeit halber weggelassen.
Keine Ahnung mit dem letzten Parameter, läuft bei mir so schon seit einigen Jahren perfekt so.

Re: JPG Auflösung automatisch herabsetzen

Verfasst: Fr, 16. Dez 2016 11:19
von jbertram
sie sleep function als siebter Parameter wartet, [u]bevor[/u] es in die Funktion hineingeht, evt. hat das ja eine Bedeutung

Re: JPG Auflösung automatisch herabsetzen

Verfasst: Fr, 16. Dez 2016 12:52
von Tom
Das stimmt. Cool. Die Funktion Time() hat eigentlich nur einen Parameter (<cBaseZone>):

Code: Alles auswählen

? Time('UTC') // 12:49:30
Rufe ich sie mit dem zusätzlichen Parameter "Sleep(200)" auf, erzeugte ich quasi ein implizites Warten:

Code: Alles auswählen

? Time('UTC',Sleep(200)) // 12:49:32
Ich weiß noch nicht, wozu das gut sein könnte, aber es geht. Da Sleep() immer NIL zurückreicht, dürfte es auch kein Problem mit nichtdokumentieren Parametern geben.