Seite 1 von 1

XbpBitmap skalieren

Verfasst: So, 21. Jul 2013 13:48
von georg
Hallo,


bei der Bearbeitung einer MP3-Datei lese ich das Cover-Bild aus und will es - verkleinert - darstellen.

Die ersten Schritte (auslesen, in ein XbpBitmap() packen, anzeigen) funktionieren, allerdings wird - da der Bereich, in dem das XbpBitmap() dargestellt werden soll, gerade mal 120*120 Pixel gross ist, nur ein Ausschnitt gezeigt. Ich suche jetzt nach einem Weg, das Bitmap so zu skalieren, dass es quasi wie eine Vorschau angezeigt wird:

Code: Alles auswählen

oBmp := XbpBitmap():new()
oBmp:create()
oBmp:setBuffer(cImage)

aPos := {200, 10}
aSize := {120, 120}
oXbp := XbpStatic():new(oDlg, oDlg, aPos, aSize)
oXbp:type := XBPSTATIC_TYPE_BITMAP
oXbp:caption := oBmp
oXbp:create()

Re: XbpBitmap skalieren

Verfasst: So, 21. Jul 2013 17:55
von Werner_Bayern
Servus Georg,

dazu nutze ich die Funktion hier aus dem Forum bmp2bmp von Jimmy (?), leicht abgewandelt, so läuft die auch unter CP3.

Code: Alles auswählen

#include "gra.ch"
FUNCTION BMP2BMP( oBMP, aXbpSize,ltransparency)
******************************************************************
LOCAL oHuge
LOCAL oTiny
LOCAL oPS
LOCAL oRet
LOCAL nBits
LOCAL nPlanes

if ltransparency == NIL
   ltransparency := .t.
endif

IF aXbpSize[ 2 ] > 0
   oHuge := oBMP
   nBits := oBMP:bits
   nPlanes := oBMP:planes

   // erst Presspace anfordern
   oPS   := XbpPresSpace():New():Create()
   // jetzt das Bitmap Objet
   oTiny := XbpBitmap():New():Create()
   IF ltransparency  // transparentClr beachten
      oTiny:transparentClr := oBMP:transparentClr
   ENDIF

   // dann das MAKE
   oTiny:Make(aXbpSize[1], aXbpSize[2], nPlanes, nBits)
   // und so klappt das auch mit Xbase++ v2.0.437
   oTiny:PresSpace(oPS)

   //Copie and resize the huge bitmap to the small bitmap
   oHuge:Draw( oPS, { 0, 0, aXbpSize[ 1 ], aXbpSize[ 2 ] },,, GRA_BLT_BBO_IGNORE  )
   oRet := oTiny
ELSE
   oRet := oBMP
ENDIF
RETURN oRet

Re: XbpBitmap skalieren

Verfasst: So, 21. Jul 2013 19:31
von georg
Hallo, Werner -


danke, werde es gleich ausprobieren.

Update: funktioniert!

Re: XbpBitmap skalieren

Verfasst: Do, 28. Aug 2014 20:08
von Wolfgang Ciriack
Hallo Werner,
nochmals Dank für deine abgeänderte Version von Jimmy, hat mir beim Testen mit 2.0 sehr geholfen :D

Re: XbpBitmap skalieren

Verfasst: Fr, 29. Aug 2014 1:12
von AUGE_OHR
georg hat geschrieben:bei der Bearbeitung einer MP3-Datei lese ich das Cover-Bild aus und will es - verkleinert - darstellen.
Frage : was nimmst du zum auslesen von ID Tags ( v2.x ? )

Tip : wenn du ein Image mit BMP2BMP "verkleinern" willst solltest du mal "4" als <nCompress> statt GRA_BLT_BBO_* nehmen.

Re: XbpBitmap skalieren

Verfasst: Fr, 29. Aug 2014 18:22
von Fischkopp
Hallo, Georg
du hast scheinbar immer gleiche Vorlagen. Wenn sie unterschiedlich sind, wird die Vorschau evtl. verzerrt.
Für beliebige Bilder ( Hoch/Querformat) berechne ich die Größe getrennt nach Höhe/Breite für die Darstellung, damit das Bild nicht gezerrt wird:

Code: Alles auswählen

   aSize    := { bImage:xSize, bImage:ySize }
   IF pSize[1]>0
      DO WHILE asize[1]>psize[1]
         aSize[1]=aSize[1]/1.1
         aSize[2]=aSize[2]/1.1
      ENDDO
   ENDIF
   IF pSize[2]>0
      DO WHILE asize[2]>psize[2]
         aSize[1]=aSize[1]/1.1
         aSize[2]=aSize[2]/1.1
      ENDDO
   ENDIF
So kann man das ganze für beliebige Darstellungsgrößen verwenden, wenn der kmpl. Code per Parameter aufgerufen wird.
Vielleicht hilft dies ja jemandem weiter, ansonsten allen erst mal
ein angenehmes Wochenende

Re: XbpBitmap skalieren

Verfasst: Mo, 07. Aug 2017 21:34
von DelUser01
Die Größenänderung der BitMap mache ich seit > 5 Jahren auch so ähnlich wie oben beschrieben. Nur dass ich das Original-BMP ebenfalls hier mit oBmp1:LoadFile( cBmpFile ) erstelle:

Code: Alles auswählen

oPs1  := XbpPresSpace():New()
oBmp1 := XbpBitMap():New():Create( oPs1 )
oBmp1:LoadFile( cFileIN )
// Bildmaße anpassen
aResize  := G1BitMapResize( nXSizeSoll , nYSizeSoll , oBmp1:xSize , oBmp1:ySize )
oBmp2 := XbpBitMap():New():Create()
oBmp2:Make( aResize[3] , aResize[4] )
oPs2  := XbpPresSpace():New()
oBmp2:PresSpace( oPs2 )
oBmp1:Draw( oPs2 , aResize , , , GRA_BLT_BBO_IGNORE )
Das funktionier noch immer.
Nun habe ich den obigen Code in eine andere Funktion übernommen, hole aber das Original-BMP mit
oBmp1:Load( nBmpID ) aus dem Resource-File. Und dann funktioniert das Ganze nicht mehr. Es kommt der Fehler:
XBP-object has wrong state for access
in der Zeile
oBmp2:PresSpace( oPs2 )
Nach etlichen Versuchen die Ursache zu finden habe ich die eigentliche Größenänderung in eine eigene Funktion gepackt, eigentlich genau so wie bei Werner beschrieben:

Code: Alles auswählen

FUNCTION BMP2BMP( oBMP, aXbpSize,ltransparency)
und siehe da, das geht.

Warum der oben genannte Fehler mit :load() auftritt habe ich also nicht herausgefunden, nur wie man um in herumkommt.