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
![Very Happy :D](./images/smilies/biggrin.gif)
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:
und siehe da, das geht.
Warum der oben genannte Fehler mit :load() auftritt habe ich also nicht herausgefunden, nur wie man um in herumkommt.