Bitmap beschneiden

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Bitmap beschneiden

Beitragvon Rudolf » Mi, 21. Sep 2016 10: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
Rudolf
Programmier-Gott
Programmier-Gott
 
Beiträge: 1166
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich

Re: Bitmap beschneiden

Beitragvon Rolf Ramacher » Mi, 21. Sep 2016 11: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
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 1807
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim

Re: Bitmap beschneiden

Beitragvon Wolfgang Ciriack » Mi, 21. Sep 2016 16:37

Es ist schön, dass du versuchst zu Helfen, aber bitte bitte Rolf, lies vorher die Frage.
Viele Grüße
Wolfgang
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 2220
Registriert: Sa, 24. Sep 2005 8:37
Wohnort: Berlin

Re: Bitmap beschneiden

Beitragvon Manfred » Mi, 21. Sep 2016 16: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
Manfred
Foren-Moderator
Foren-Moderator
 
Beiträge: 15970
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Re: Bitmap beschneiden

Beitragvon Rudolf » Mi, 21. Sep 2016 18:18

Hallo Leute,
der Wille zählt fürs Werk, schön dass es diese Forum gibt !
Grüße
Rudolf
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
 
Beiträge: 1166
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich

Re: Bitmap beschneiden

Beitragvon AUGE_OHR » Mi, 21. Sep 2016 21: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
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10146
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Bitmap beschneiden

Beitragvon Rudolf » Do, 22. Sep 2016 6: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) 607-mal betrachtet
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
 
Beiträge: 1166
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich

Re: Bitmap beschneiden

Beitragvon brandelh » Do, 22. Sep 2016 6: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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13267
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Re: Bitmap beschneiden

Beitragvon Rudolf » Do, 22. Sep 2016 7: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
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
 
Beiträge: 1166
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich


Zurück zu Allgemeine Fragen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste