XbpBitmap skalieren

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

XbpBitmap skalieren

Beitrag 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()
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: XbpBitmap skalieren

Beitrag 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
es grüßt

Werner

<when the music is over, turn off the lights!>
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: XbpBitmap skalieren

Beitrag von georg »

Hallo, Werner -


danke, werde es gleich ausprobieren.

Update: funktioniert!
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: XbpBitmap skalieren

Beitrag 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
Viele Grüße
Wolfgang
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: XbpBitmap skalieren

Beitrag 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.
gruss by OHR
Jimmy
Benutzeravatar
Fischkopp
UDF-Programmierer
UDF-Programmierer
Beiträge: 63
Registriert: Sa, 19. Jul 2014 10:31
Wohnort: Berlin

Re: XbpBitmap skalieren

Beitrag 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
Grüße aus Berlin

Reiner
DelUser01

Re: XbpBitmap skalieren

Beitrag 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.
Antworten