Bitmapgröße ändern im Hintergrund

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
mr@nline.de
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 37
Registriert: Do, 19. Okt 2006 10:24
Wohnort: St. Martin

Bitmapgröße ändern im Hintergrund

Beitrag von mr@nline.de »

Ist es eigentlich möglich eine Graphikdatei (.jpg) im Hintergrund, also ohne sie in einem Dialog anzuzeigen, in der Größe zu verändern und dann
wieder in einer neuen Graphikdatei abzuspeichern ?

Gruss Manfred
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

du kannst eine JPG mit XbpBitmap() laden und einem Presentationspace zuordnen, ohne dass dieser auf dem Bildschirm sichtbar sein muss.
Mit GraBitBlt() müssten darin nun Größenänderungen möglich sein.
Danach mit savefile() speichern.

Mit GraBitBlt() habe ich noch nicht gearbeitet.

Ich habe neue Grafiken erzeugt und gespeichert. Allerdings mit GIF, da PNG zu langsam war. BMP ist bei kleinen Sachen OK.
JPG hat bei mir zu ausgefranstem Text geführt (ich habe eine 16 Farben Grafik mit Text erstellt) - bei Bildern ist JPG bestimmt besser.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Bitmapgröße ändernim Hintergrund

Beitrag von AUGE_OHR »

hi,
mr@nline.de hat geschrieben: Ist es eigentlich möglich eine Graphikdatei (.jpg) im Hintergrund, also
ohne sie in einem Dialog anzuzeigen, in der Größe zu verändern und
dann wieder in einer neuen Graphikdatei abzuspeichern ?
grundsätzlich ja, aber es könnte bei JPG Probleme geben beim lesen
von "verschiedenen" Formaten.
so nun hier 2 Möglichkeiten :

Code: Alles auswählen

FUNCTION ThumbNail(cFileName,aSize,nCompr)
LOCAL oPS2, oBMP1, oBMP2, cThumbName
 //LOCAL oPS1

 DEFAULT nCompr TO 0

 cThumbName := left(cFileName,len(cFileName)-4)+"_thumb"+right(cFileName,4)

 if file(cFileName) .and. !file(cThumbName)
  oBMP1:= XbpBitmap():New():Create()
  // Grafik Datei laden
  oBMP1:LoadFile(cFileName)

  if aSize == NIL
   // Grösse feststellen
   aSize := {oBMP1:xSize,oBMP1:ySize}
  endif

  oBMP2:= XbpBitmap():New():Create()
  oPS2:= XbpPresSpace():New():Create()
  // Presspace anfordern 
  oBMP2:PresSpace(oPS2)
  // make aufrufen mit original :Planes und :bits
  oBMP2:Make(aSize[1],aSize[2],oBMP1:Planes,oBMP1:Bits)
  // altes Bild in neues zeichnen
  oBMP1:Draw(oPS2,{0,0,aSize[1],aSize[2]},,,3)
  // sichern der neuen Datei als JPG 
  oBMP2:SaveFile(cThumbName,XBPBMP_FORMAT_JPG,nCompr)

  oPS2:Destroy()
  oBMP1:Destroy()
  oBMP2:Destroy()
 endif
oder

Code: Alles auswählen

 if file(cFileName) .and. !file(cThumbName)
  oBMP1:= XbpBitmap():New():Create()
  oPS1:= XbpPresSpace():New():Create()
  oBMP1:PresSpace(oPS1)
  oBMP1:LoadFile(cFileName)
 
  if aSize == NIL
   aSize := {oBMP1:xSize,oBMP1:ySize}
  endif
  // "male" Bild in Presspace 
  oBMP1:Draw(oPS1,{0,0,oBMP1:xSize,oBMP1:ySize})
 
  oBMP2:= XbpBitmap():New():Create()
  oPS2:= XbpPresSpace():New():Create()
  oBMP2:PresSpace(oPS2)
  oBMP2:Make(aSize[1],aSize[2],oBMP1:Planes,oBMP1:Bits)
  // transfomiere mittels GraBitBlt
   GraBitBlt(oPS2,oPS1,{0,0,aSize[1],aSize[2]}, {0,0,oBMP1:xSize,oBMP1:ySize},,3
)
 oBMP2:SaveFile(cThumbName,XBPBMP_FORMAT_JPG,nCompr)
 oPS1:Destroy()
 oPS2:Destroy()
 oBMP1:Destroy()
 oBMP2:Destroy()
endif

RETURN cThumbName
gruss by OHR
Jimmy
mr@nline.de
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 37
Registriert: Do, 19. Okt 2006 10:24
Wohnort: St. Martin

Beitrag von mr@nline.de »

Vielen Dank es funktioniert !

Ich habe nur noch das Problem, das sich manche .jpg Dateien
mit :loadfile() zwar ohne Fehler laden lassen, aber die Ausgabe immer
eine schwarze Fläche aufweist.
Ist das ein bekanntes Problem, oder gibt es da noch etwas anderes zu beachten ?

Gruss
Manfred
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
das Problem ist bekannt - ein "fehlerhafter" (proprietärer) Header, der durch entsprechende (Scanner-)Software so erzeugt wird!
Einfach die Datei mit einem Grafikprogramm öffnen und speichern - dabei wird im Allgemeinen der Header korrigiert. Es gibt auch einen PDR dazu, in dem dieses Vorgehen als Workaround beschrieben wird.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
mr@nline.de
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 37
Registriert: Do, 19. Okt 2006 10:24
Wohnort: St. Martin

Beitrag von mr@nline.de »

Hallo Martin,
ja das funktioniert zwar, wenn ich die Datei mit einem Bildbeabrbeitungsprogramm öffne und neu speichere, aber es handelt sich hierbei um eine ganze Verzeichnissstruktur mit ca. 1500 Bildern von einer Digitalkamera !
Kann man den Header per Programm korrigieren ?

Gruss
Manfred
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Manfred.

Mindestens PaintShop Pro (aber auch andere Bildbearbeitungsprogramme) haben Scripting-Funktionen, die die Automatisierung solcher Prozesse zulassen. Und einige verfügen über Active-X-Komponenten, die man für derlei nutzen kann.
Herzlich,
Tom
mr@nline.de
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 37
Registriert: Do, 19. Okt 2006 10:24
Wohnort: St. Martin

Beitrag von mr@nline.de »

Hallo Tom,

Zur Konvertierung der Bilder kann man natürlich auch den
"Windows scripting Host" einsetzen, und z.B. einfach mspaint
fernsteuern.
Hier ein Beispiel Dateiname="Bilder.vbs"

Code: Alles auswählen

set wshshell = Createobject("WScript.Shell")
set fs       = CreateObject("Scripting.FileSystemObject")
set ordner   = fs.GetFolder("m:\temp\bilder")


wshshell.Run "mspaint.exe"
wScript.Sleep 5000

for each datei in ordner.files
   wshshell.SendKeys("^o")
   wshshell.SendKeys("m:\temp\bilder\"+datei.name)
   wscript.Sleep 250
   wshshell.SendKeys("{ENTER}")
   wscript.Sleep 250

   wshshell.SendKeys("^s")
   wscript.Sleep 1000

next
wshshell.SendKeys("%{F4}")

Gruss
Manfred
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

ich bin mit nicht ganz sicher und kann es hier auf der Arbeit auch nicht probieren,
aber ich denke IrvanView kann ein Batchkonvertierung durchführen.
Gruß
Hubert
Antworten