Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: BitBlt esimerkki

Sivun loppuun

tesmu [04.05.2005 20:58:11]

#

ELi haluaisin kuvastani leikata bitblteellä(luulen niin) mustan värin kokonaan poies

Puhveli [04.05.2005 21:02:24]

#

Kuvan taustavärin täytyy olla musta, ja sillä täytyy olla erikseen maskibittikartta, jossa taustaväri on valkoinen ja muu mustaa.

Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long

BitBlt kohde.hDC, x, y, leveys, korkeus, maski.hDC, lukualkux, lukualkuy, VbScrAnd
BitBlt kohde.hDC, x, y, leveys, korkeus, kuva.hDC, lukualkux, lukualkuy, VbScrInvert

Tässä on parametrit (copypaste jostain, en muista lähdettä mutta sillä oli jotain tekemistä putkan kanssa):

        'vbDstInvert   Inverts the destination bitmap
        'vbMergeCopy   Combines the pattern and the source bitmap
        'vbMergePaint  Combines the inverted source bitmap with the destination bitmap by using Or
        'vbNotSrcCopy  Copies the inverted source bitmap to the destination
        'vbNotSrcErase Inverts the result of combining the destination and source bitmaps by using Or
        'vbPatCopy     Copies the pattern to the destination bitmap
        'vbPatInvert   Combines the destination bitmap with the pattern by using Xor
        'vbPatPaint    Combines the inverted source bitmap with the pattern by using Or.
        '              Combines the result of this operation with the destination bitmap by using Or
        'vbSrcAnd      Combines pixels of the destination and source bitmaps by using And
        'vbSrcCopy     Copies the source bitmap to the destination bitmap
        'vbSrcErase    Inverts the destination bitmap and combines the result with the source bitmap by using And
        'vbSrcInvert   Combines pixels of the destination and source bitmaps by using Xor
        'vbSrcPaint    Combines pixels of the destination and source bitmaps by using Or

btw, tein joskus apuohjelman joka tekee kuvista maskeja (jos ihmisillä eivät sattuisi omistamaan kuvankäsittelemisohjelmia) http://sooda.dy.fi:8080/mordor/dl/bin/maskeeraaja.exe.

Tälläsiin mieltä askarruttaviin kysymyksiin yleensä auttaa yleismaailmallinen Rtfm() -funktio, parametriksi kelpaa hyvin esim "ohjelmointiputka.net/oppaat.php". Funktio palauttaa esimerkiksi tällaisin spriteiksi kutsuttuihin kuviin liittyvissä ongelmissa (kuten vaikka tätä juuri edeltävä aihe) tulokseksi https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=spriteo tai vastaavaa.

tesmu [04.05.2005 23:30:30]

#

en nyt ole varma olenko hakoteillä vai teinkö oikein

BitBlt picukko.hDC, X, Y, 800, 400, maski.hDC, 0, 0, VbScrAnd
BitBlt picukko.hDC, X, Y, 800, 400, picukko.hDC, 0, 0, VbScrInvert

Ei ainakaan toiminut.
Ja koitin myös vitun manuaali functiota mutta siitä en saanut mitään selvää. Tai sain mutta en tajunnut kunnolla.
ELi tossa on mun hahmot mitä pitäisi muuttaa.

Blaze [05.05.2005 00:39:44]

#

Puhveli kirjoitti:

Tälläsiin mieltä askarruttaviin kysymyksiin yleensä auttaa yleismaailmallinen Rtfm() -funktio, parametriksi kelpaa hyvin esim "ohjelmointiputka.net/oppaat.php".

Mwah, Puhveli alkaa osata :P

thekoodaaja [05.05.2005 08:54:55]

#

Löytyisikö jostain sama juttu, mutta vb.NET:ille?

hohoo [05.05.2005 14:15:00]

#

tesmu kirjoitti:

en nyt ole varma olenko hakoteillä vai teinkö oikein

BitBlt picukko.hDC, X, Y, 800, 400, maski.hDC, 0, 0, VbScrAnd
BitBlt picukko.hDC, X, Y, 800, 400, picukko.hDC, 0, 0, VbScrInvert

Ei ainakaan toiminut.
Ja koitin myös vitun manuaali functiota mutta siitä en saanut mitään selvää. Tai sain mutta en tajunnut kunnolla.
ELi tossa on mun hahmot mitä pitäisi muuttaa.

vbSrc, ei vbScr

BitBlt picukko.hDC, X, Y, 800, 400, maski.hDC, 0, 0, VbSrcAnd
BitBlt picukko.hDC, X, Y, 800, 400, picukko.hDC, 0, 0, VbSrcInvert

tesmu [05.05.2005 17:04:32]

#

eipä toiminu vieläkään tällä kertaa kyllä tuo maski meni tämän ukon päälle ja se muuttui mustaksi =D

Puhveli [05.05.2005 20:16:31]

#

sori, heitin tuon Scr:n lonkalta ja typotin tietty, mutta olisi tuosta "toisesta listauksesta" voinu päätellä miten se oikeesti menee :P, tai sitten siitä että VbSrcCopy on lyhenne sanoista Visual Basic Source (bitmap) Copy, ja tarkoittaa kuvan tulostamista suorana kopiona kuvasorsasta (basicissa vastaava on "PUT (x, y), kuva&, PSET").

Mutta joo, et halua piirtää sitä kuvaa samaan missä kuvan sorsa on, vaan pelikentälle (peliä teet kuitenkin). Kohteen, eli Formin tai PictureBoxin AutoRedraw on syytä olla True ja ScaleModen 3 eli Pixel.

kohde.AutoRedraw = True
kohde.ScaleMode = 3

BitBlt kohde.hDC, x, y, maski.ScaleWidth, maski.ScaleHeight, maski.hDC, 0, 0, VbSrcAnd
BitBlt kohde.hDC, x, y, kuva.ScaleWidth, kuva.ScaleHeight, kuva.hDC, 0, 0, VbSrcInvert

tesmu [05.05.2005 20:29:27]

#

jos nyt oikein ymmärsin niin näin

BitBlt picukko.hDC, X, Y, 800, 400, maski.hDC, 0, 0, vbSrcAnd
BitBlt Form1.hDC, X, Y, 800, 400, picukko.hDC, 0, 0, vbSrcInvert

Mutta ei toimi :(

Puhveli [05.05.2005 20:43:44]

#

Et ymmärtänyt oikein, lue uudestaan mun edellinen threadi :( Molemmissa pitää olla sama kohde.

tesmu [05.05.2005 20:59:07]

#

BitBlt Form1.hDC, X, Y, 800, 400, maski.hDC, 0, 0, vbSrcAnd
BitBlt Form1.hDC, X, Y, 800, 400, picukko.hDC, 0, 0, vbSrcInvert

Onko vielä jotain lisättävää meinaan tuokaan ei toimi

Puhveli [05.05.2005 21:19:27]

#

Pahus, on toki :D
BitBlt on siitä kiva funktio, että se pistä kohdettaan päivittymään, eli voit piirtää hitaammillakin koneilla tuhansia miljoonia biljoonia kuvia kohteelle, ja näyttää ne kaikki sitten kerralla, toisin kuin VB:hen tungetuilla oletusgrafiikkafunktioilla.

Eli BitBlt tarvitsee aina kohde.Refresh-käskyn, tai jonkun muun (esim grafiikkafunktion) joka tekee saman kaupanpäällisinä.

nomic [06.05.2005 14:45:22]

#

yksi vaihtoehto on tietysti että käyttää Transparentblt:iä.
alla pieni esimerkki

tarviit picture1,picture2[jossa on kuva]
ja F5-napin/Start.

Private Declare Function TransparentBlt Lib "msimg32.dll" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal crTransparent As Long) As Boolean
Dim a As Long
Private Sub Form_Load()
  Me.Show
  DoEvents
  a = TransparentBlt(Picture1.hDC, 0, 0, 64, 64, Picture2.hDC, 0, 0, 64, 64, RGB(0, 0, 0))
End Sub

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta