Saako picture boxsissa olevaa kuvaa/grafikkaa vaihettua negatiiviseks ilman lukematta sisältöä pikseli kerrallaan ja muuttamalla sitten pisteen väriä.
Musta valkoseks ja muut värit mitä niistä sitten tuleekin.
Saa, ja vielä ihan helpostikin. Kyseiseen voit käyttää bitblt nimistä apia (ks. haku, koodivinkit). Kopioimisen (vbsrccopy) sijasta annat apille viimeiseksi parametriksi vbsrcinvert.
Ja ilman apiakin PaintPicture-metodilla.
Tossa on yksin kertainen ja hidasta tapa tehdä negaatiivinen kuva.
Private Sub Form_Click() Picture1.ScaleMode = 3 'yksikkö pikseli Dim i As Integer, j As Integer, vari As Long Dim r As Integer, g As Integer, b As Integer Dim rr As Integer, gg As Integer, bb As Integer For i = 0 To Picture1.ScaleWidth For j = 0 To Picture1.ScaleHeight 'luetaan pikselin väri vari = Picture1.Point(i, j) 'lasketaan väriarvosta r, g ja b r = vari Mod 256 g = (vari \ 256) Mod 256 b = vari \ 65536 'värit käänteis väreiksi rr = 256 - r gg = 256 - g bb = 256 - b 'vaihdetaan pikselin väri Picture1.PSet (i, j), RGB(rr, gg, bb) Next Next End Sub
Milu kirjoitti:
lukematta sisältöä pikseli kerrallaan
Tuossa nyt kuitenkin luetaan pikseli kerrallaan. :)
Ihan hyvää harjoitusta itse tehdyt koodit ovat, ei siinä mitään, mutta jos haluaa tehdä nopeasti, kannattaa käyttää valmiita funktioita.
Miten tolla PaintPicture-metodilla tapahtuis, jos sais vaikka esimerkin.
petrinm:
Mitä järkeä on erottaa jokainen väri, vähentää jokainen erikseen ja sitten koota taas kokonaiseksi väriarvoksi? Kaiken voi vähentää kerralla.
Picture1.PSet (i, j), (16777215 - vari)
Jos Not-operaatio toimii luvuille (en tiedä VB:stä), niin sillä sitten. Tai Xor-operaatiolla.
Muutenkin tuossa 256:n paikalla pitäisi olla 255, koska lukuarvo on väliltä (0 .. 255).
rr = 255 - r
Näin toimii PaintPicturella:
Picture1.PaintPicture Picture1, 0, 0, , , , , , , vbDstInvert
Miksi jos picture boxsiin jossa on musta tausta tuo kuvan, jossa on vaikka valkosella pohjalla musta ympyrä se ei vbSrcInvert:llä muuta sitä negatiiviseks, mutta jos tausta on valkoinen, silloin se kyllä muutta tuodun kuvan negatiiviseksi?
Lue tarkemmin. Siinä pitää olla vbDstInvert.
Luettu on, mutta dst:llä ei muuta ollenkaan, ainoastaan src:llä muutta, mutta siinäkään ei jos tausta on musta.
Laitappas esimerkki kaikkineen ohjeiskäskyineen, jossa picture boxsista kopioidusta kuvasta tehdään käänteinen.
Voipi olla, että mulla on moka jossain muussa siinä koodissa.
Lähetin esimerkkiprojektin sähköpostilla.
Aihe on jo aika vanha, joten et voi enää vastata siihen.