Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

Bitmap beschneiden

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1304
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Bitmap beschneiden

Beitrag von Rudolf » Mi, 21. Sep 2016 11:53

Hallo,
möchte einen Ausschnitt aus einem Bitmap, bekomme aber immer nur ein leeres (schwarzes) Bitmap zurück, was stimmt nicht ?
Grüße
Rudolf

Code: Alles auswählen

function cropimage(cBuffer,aFields,x)
******************************************************************
local oBmp,nBSizex := 0,nBSizeY := 0,oPS
if substr(cBuffer,1,2) = "BM"
     cBuffer := substr(cBuffer,15)
endif
oPS  := XbpPresSpace():New():Create()
oBmp := xbpBitmap():new():create(oPS)
oBmp:setbuffer(cBuffer)
nBSizex := oBmp:xSize
nBSizeY := oBmp:ySize
oBmp := GraSaveScreen( oPS, {100,100},{30,50})
oBmp:savefile("test.bmp")
return .t.




FUNCTION GraSaveScreen( oSourcePS, aPos, aSize )
******************************************************************
LOCAL oBitmap   := XbpBitmap():new():create( oSourcePS )
LOCAL oTargetPS := XbpPresSpace():new():create()
LOCAL aSourceRect[4], aTargetRect
aSourceRect[1] := aSourceRect[3] := aPos[1]
aSourceRect[2] := aSourceRect[4] := aPos[2]
aSourceRect[3] += aSize[1]
aSourceRect[4] += aSize[2]
aTargetRect    := {0, 0, aSize[1], aSize[2]}
oBitmap:presSpace( oTargetPS )
oBitmap:make( aSize[1], aSize[2] )
GraBitBlt( oTargetPS, oSourcePS, aTargetRect, aSourceRect )
RETURN oBitmap

Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1820
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Kontaktdaten:

Re: Bitmap beschneiden

Beitrag von Rolf Ramacher » Mi, 21. Sep 2016 12:45

Hallo Rudolf,

ich mache das etwas anders. ich hinterlege das Bitmap zu einem pushbutton

Code: Alles auswählen

	oBmp:= XbpBitmap():new() 
	oBmp:load(nil,2001) 
	oBmp:create(oDlg)

   oXbp := XbpPushButton():new( drawingArea, , aBtmPos, {500,400}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } } )
   oXbp:caption := (oBmp)
   oXbp:create()
   oXbp:activate := {|| Gather( aEditControls ),  .f.  }
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de

Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2288
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Kontaktdaten:

Re: Bitmap beschneiden

Beitrag von Wolfgang Ciriack » Mi, 21. Sep 2016 17:37

Es ist schön, dass du versuchst zu Helfen, aber bitte bitte Rolf, lies vorher die Frage.
Viele Grüße
Wolfgang

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 16942
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Re: Bitmap beschneiden

Beitrag von Manfred » Mi, 21. Sep 2016 17:39

ach, Rolf ist ne köllsche Frohnatur. Sein Motto: Dabeisein ist alles :badgrin:
Gruß Manfred
Mitglied der XUG Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.

Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1304
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Bitmap beschneiden

Beitrag von Rudolf » Mi, 21. Sep 2016 19:18

Hallo Leute,
der Wille zählt fürs Werk, schön dass es diese Forum gibt !
Grüße
Rudolf

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10579
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Bitmap beschneiden

Beitrag von AUGE_OHR » Mi, 21. Sep 2016 22:06

Rudolf hat geschrieben:möchte einen Ausschnitt aus einem Bitmap,

Code: Alles auswählen

FUNCTION GraSaveScreen( oSourcePS, aPos, aSize )
...
aSourceRect[1] := aSourceRect[3] := aPos[1]
aSourceRect[2] := aSourceRect[4] := aPos[2]
aSourceRect[3] += aSize[1]
aSourceRect[4] += aSize[2]
aTargetRect    := {0, 0, aSize[1], aSize[2]}
wenn die Grösse von aSourceRect = aTargetRect ist es 1:1 und kein Ausschnitt.
Rudolf hat geschrieben:bekomme aber immer nur ein leeres (schwarzes) Bitmap zurück, was stimmt nicht ?

Code: Alles auswählen

function cropimage(cBuffer,aFields,x)
du hast doch wohl ein Bitmap Object also ist die FUNCTION cropimage() überflüssig.

zum vergrössern/verkleinern eines Bitmap Object gehe ich so vor

Code: Alles auswählen

FUNCTION BMP2BMP( oBMP, aXbpSize, oPS )
LOCAL oHuge
LOCAL oTiny
LOCAL oRet
LOCAL nBits
LOCAL nPlanes

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

      IF oPS = NIL
         oPS := XBPPRESSPACE() :new() :Create()
      ENDIF
      //Create a small bitmap to fit in our XbpStatic
      oTiny := XBPBITMAP() :New() :Create()

      IF nBits > 1 .OR. nPlanes > 1
         oTiny:Make( aXbpSize[ 1 ], aXbpSize[ 2 ], nPlanes, nBits )
      ELSE
         oTiny:Make( aXbpSize[ 1 ], aXbpSize[ 2 ] )
      ENDIF
      oTiny:transparentClr := oBMP:getDefaultBGColor()
      oTiny:presSpace( oPS )

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

RETURN oRet
wenn es nur ein (Source) Ausschnitt sein soll musst du aSourceRect anpassen.
gruss by OHR
Jimmy

Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1304
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Bitmap beschneiden

Beitrag von Rudolf » Do, 22. Sep 2016 7:28

Hallo Jimmy,
danke, hab oBmp:draw() jetzt verstanden, funktioniert im Prinzip, nur ist das Ergebnis noch nicht ganz richtig, was könnte da falsch sein ?
Grüße
Rudolf

Code: Alles auswählen

function croptest()
******************************************************************

local oPDF,oPS,oBmp,nOk,cBuffer,nBits,nPlanes,oTiny,oPS2
local aSize := {300,100},aPos := {120,80}
WITH OBJECT ( oPdf := TQuickPdf():New() )
     nOk  := .:LoadFromFile("test.pdf")
     cBuffer := .:RenderPagetoString(150,1,0)
     if substr(cBuffer,1,2) = "BM"
          cBuffer := substr(cBuffer,15)
     endif
     oPS  := XbpPresSpace():New():Create()
     oBmp := xbpBitmap():new():create(oPS)
     oBmp:setbuffer(cBuffer)
     nBSizex   := oBmp:xSize
     nBSizeY   := oBmp:ySize
     nBits     := oBMP:bits
     nPlanes   := oBMP:planes

     oPS2 := XBPPRESSPACE() :new() :Create()
     //Create a small bitmap to fit in our XbpStatic
     oTiny := XBPBITMAP() :New() :Create()
     IF nBits > 1 .OR. nPlanes > 1
          oTiny:Make( aSize[ 1 ], aSize[ 2 ], nPlanes, nBits )
     ELSE
          oTiny:Make( aSize[ 1 ], aSize[ 2 ] )
     ENDIF
     oTiny:transparentClr := oBMP:getDefaultBGColor()
     oTiny:presSpace( oPS2 )

     //Copie and resize the huge bitmap to the small bitmap
     oBmp:Draw( oPS2, { 0, 0, aSize[ 1 ], aSize[ 2 ] }, ; // aTargetRect
                    { 400,400, aSize[ 1 ], aSize[ 2 ] }, ; // aSourceRect
                                                            , ; // nRasterOP
                                        GRA_BLT_BBO_IGNORE   ) // nCompress
     oTiny:savefile("crop.bmp")
     .:Destroy()
END WITH
return .t.
Dateianhänge
2016-09-22_07h25_22.png
2016-09-22_07h25_22.png (46.89 KiB) 949 mal betrachtet

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13768
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Bitmap beschneiden

Beitrag von brandelh » Do, 22. Sep 2016 7:33

Der Ursprungspunkt liegt bei Xbase++ ja links unten (normal) deine Bitmap sieht aus, als ob sie 180° verdreht bzw. horizontal gespiegelt wurde. Oben und unten tauschen ?
Gruß
Hubert

Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1304
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Bitmap beschneiden

Beitrag von Rudolf » Do, 22. Sep 2016 8:08

Hallo Hubert,
danke, hast Recht, ich hab übersehen dass ich nicht ein Array mit Größe benötige sondern die Koordinaten.
Grüße
Rudolf

Antworten