Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Jak překrýt existující Bitmap barvou?

Dobrý den, jsem začátečník ve visual basicu a mám takovýto kód, vím že je to paskvil ale to ted prosím neřešte, potřebuji poradit jak udělat v třetím řádku od spodu následující (něco na tenhle způsob, s touhle funkcí):

If True And Form2.Button2.BackColor = Color.Red Then New Bitmap(zkouska1)BackColor = Color.Red

Chápete? aby Když vyvolám ten "klik" který je řešený posledním odstavcem v kódu a ten button2 na Formě2 bude zároveň červený, potrebuju aby se tedy ta vykreslena bitmapa (zkouska1) prebarvila do cervene barvy...
Pro doplnění: Tenhle kód je v podstatě vykreslý bitmap z obrázku a když ten program spustám tak ukáže Formu1 ktera je pruhledna a na ni je vykresleny ten bitmap z obrazku 1.png(zkouska1). A v posledním odstavci potřebuji zmenit barvu toho již vykresleného obrázku v závislosti na barvě buttonu2 na Formě2. Ovšem na ten button2 nikdy nekliká, jenom se meni jeho barva...

Public Class zkouska1
Private _zkouska1 As New Bitmap("C:\Users\w\Desktop\brno_skola\reduta\Progr am\Bila\1.png")
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
Form1.Show()
Form2.Show()
MyBase.OnPaint(e)

e.Graphics.DrawImageUnscaled(New Bitmap(_zkouska1), 0, 0)
End Sub
Private Sub zkouska1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
MyNewSub()
End Sub

Sub MyNewSub()
BackColor = Color.Red
TransparencyKey = BackColor
End Sub
Private Sub Example_ControlAdded(ByVal sender As Object, ByVal e As System.Windows.Forms.ControlEventArgs) Handles Me.ControlAdded

AddHandler e.Control.MouseClick, AddressOf Example_MouseClick
End Sub

Private Sub Example_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
If True And Form2.Button2.BackColor = Color.Red Then ??? řešení ???
End Sub
End Class
[b]
Může pomoct něco z těchto kódů?

1,

Public Function GetColoredBitmap(w as Integer,
h as Integer,
col as Color) as Bitmap

Dim bmp as New Bitmap(w, h, PixelFormat32bppPARGB)
Using g as Graphics = Graphics.FromImage(bmp)
g.Clear(col)
End Using

Return bmp

End function


2,

Private sub Button2_Clicked(s as object, e as eventargs) handles Button2.Click

Dim bmp as bitmap = GetColoredBitmap(100, 100, Button2.BackColor)
bmp.SaveAs("path/to/file.png")
bmp.Dispose

End sub

3,

Public Sub ColorBitmap(bmp as Bitmap, col as Color)

Using g as Graphics = Graphics.FromImage(bmp)
g.Clear(col)
End Using

End Sub

Předmět Autor Datum
Snažil jsem se hodně, ale stejně jsem nepochopil, co vlastně chceš.
Wikan 05.01.2013 17:56
Wikan
Mám kód který jsem zde vložil, kteý mi po spuštění vykreslí na obrazovku Bitmap. Já potřebuji udělat…
klikihak 05.01.2013 18:03
klikihak
Tady máš příklad jak upravit Bitmapu: http://msdn.microsoft.com/en-us/library/5ey6h79d.a spx
Wikan 05.01.2013 18:17
Wikan
A nevis prosim jak by mel tedy vypadat ten muj kod aby to fungovalo tak jak potrebuju? Jsem uz zoufa…
klikihak 05.01.2013 18:19
klikihak
Uprav ho podle toho příkladu.
Wikan 05.01.2013 18:20
Wikan
Ja to nedokazu, jsem vazne zacatecnik... Prosim, pomoz mi, uz se v tom babram hrozne dlouho :(
klikihak 05.01.2013 18:22
klikihak
Private Sub Example_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArg…
Wikan 05.01.2013 18:42
Wikan
Dekuji moc, ale podtrhlo mi to text bmp tady: Dim bytes As Integer = Math.Abs(bmpData.Stride) * bmp.…
klikihak 05.01.2013 18:46
klikihak
´bmp´ is not declared. It may be inaccessible due to its protection level.
klikihak 05.01.2013 18:47
klikihak
Dim bytes As Integer = Math.Abs(bmpData.Stride) * _zkouska1.Height Událost Paint už tam obsluhuješ…
Wikan 05.01.2013 18:50
Wikan
Takze ted kdyz kliknu na tu Bitmapu _zkouska jedna a button2 je cerveny, melo by mi tu bitmapu zmeni…
klikihak 05.01.2013 18:55
klikihak
Zkus ještě na konec dát Refresh()
Wikan 05.01.2013 18:56
Wikan
Kdyz jsem napsal refresh() a spustil, kliknul, objevi se mi toto: d9145872a1
klikihak 05.01.2013 19:01
klikihak
Tak změň: For counter As Integer = 0 To rgbValues.Length - 1 If counter Mod 3 = 2 Then rgbValues(co…
Wikan 05.01.2013 19:06
Wikan
Ted to zas podtrhlo vlnovkou to cilo: 16711680 (Constant expression not representable in type ´Byte…
klikihak 05.01.2013 19:10
klikihak
V jakém formátu je ten původní obrázek? Pokud by měl 24bitové barvy, tak by ten původní kód měl fung…
Wikan 05.01.2013 19:20
Wikan
windows mi píše že je to bitová hloubka 32 ale já to exportoval z Corel Draw ve 24bitech...
klikihak 05.01.2013 19:24
klikihak
Zkusil jsem to, funguje mi to. Problém bude v původním obrázku.
Wikan 05.01.2013 19:39
Wikan
45d894be6d Tady je můj obrázek, je tedy špatný?
klikihak 05.01.2013 19:43
klikihak
Je 32bitový. Pro něj budu fungovat tohle: For counter As Integer = 0 To rgbValues.Length - 1 If cou…
Wikan 05.01.2013 19:53
Wikan
Jenomze ted se mi prebarvil cely ten obdelnik, ne jenom samotny tvar, tobe se prebarvil jenom ten tv…
klikihak 05.01.2013 20:00
klikihak
O tom jsi nepsal. Já potřebuji udělat to, aby když na tento bitmap kliknu, tak aby se mi jeho barva…
Wikan 05.01.2013 20:01
Wikan
Ano, barva toho bitmapu ve tvaru toho bitmapu samozrejme...
klikihak 05.01.2013 20:02
klikihak
Coo?
Wikan 05.01.2013 20:04
Wikan
No ten bitmap co jsem vam posilal je takovy sedy pazourek na bilem/pruhlednem pozadi, ja potrebuji a…
klikihak 05.01.2013 20:06
klikihak
Je to problem? :(
klikihak 05.01.2013 20:04
klikihak
Problém ne, jenom nesmysl. Co konkrétně se má přebarvit?
Wikan 05.01.2013 20:06
Wikan
aby to vypadalo takto: 88054963b0 a ne takto: 008dc1eb38
klikihak 05.01.2013 20:11
klikihak
For counter As Integer = 0 To rgbValues.Length - 1 Dim modulo As Integer = counter Mod 4 If modulo =…
Wikan 05.01.2013 20:12
Wikan
Ano! To je ono! Vyborne! Dekuji! Omlouvam se za nedorozumeni. Jen jeste jeden dotaz, jak udelat aby…
klikihak 05.01.2013 20:15
klikihak
Řádek rgbValues(counter) = 255 nastavuje jednotlivé ARGB hodnoty barvy obrázku. Takže si zjistíš j…
Wikan 05.01.2013 20:17
Wikan
A nejak automaticky to nelze? kdyby se ta barva buttonu2 menila pri spustenem programu, aby reagoval…
klikihak 05.01.2013 20:20
klikihak
O tom pochybuju.
Wikan 05.01.2013 20:27
Wikan
ale ten radek na tu je tam jenom dvakrat, jak tedy mohu napsat R G i B?
klikihak 05.01.2013 20:29
klikihak
Protože jeden pixel je tvořen 4 hodnotami v pořadí BGRA. A musíš správně nastavit všechny 4 hodnoty.
Wikan 05.01.2013 20:32
Wikan
A jak tedy nastavim napriklad (255, 174, 201)? A neslo by aby to bylo automaticky nejak pridat toto…
klikihak 05.01.2013 20:35
klikihak
Automaticky nejde nikdy nic. Jeden byte nastavíš na 255, další na 174, další na 201.
Wikan 05.01.2013 20:51
Wikan
ale porad nechapu jak, respektive kam to napsat...
klikihak 05.01.2013 20:53
klikihak
Přečti si znovu, co jsem psal.
Wikan 05.01.2013 20:55
Wikan
Ja opravdu nevim, netrapte me prosim...
klikihak 05.01.2013 20:58
klikihak
Ale já opravdu nemám chuť za tebe všechno udělat. Dostal jsi dost informací k tomu, abys to za 5 min…
Wikan 05.01.2013 20:59
Wikan
' Set every third value to 255. A 24bpp image will look red. For counter As Integer = 0 To rgbValues…
klikihak 05.01.2013 21:02
klikihak
Tenhle kód nastaví každou 3. hodnotu ze 4 na 255, první a druhou na 174. Čtvrtou přeskakuje.
Wikan 05.01.2013 21:05
Wikan
' Set every third value to 255. A 24bpp image will look red. For counter As Integer = 0 To rgbValues…
klikihak 05.01.2013 21:11
klikihak
Víš vůbec jak se tvoří podmínky? http://msdn.microsoft.com/en-us/library/752y8abs.a spx
Wikan 05.01.2013 21:15
Wikan
Ja vam rikam ze jsem naprosty zacatecnik, prosim, jak to ma tedy vypadat? :(
klikihak 05.01.2013 21:17
klikihak
Pokud za tebe všechno udělá někdo jiný, tak se vůbec nic nenaučíš.
Wikan 05.01.2013 21:18
Wikan
Uvidim jak to ma vypadat spravne a z toho si dokazi odvodit proc to tak je ale takhle na to nikdy ne…
klikihak 05.01.2013 21:18
klikihak
Prosim...
klikihak 05.01.2013 21:24
klikihak
Dobry den, vazim si vasi pomoci a ocenuji vasi ochotu, ale prozradite mi prosim, jak by mel vypadat…
klikihak 06.01.2013 21:29
klikihak
Tak znovu a naposled. Nastavíš jednotlivé byty na příslušné hodnoty.
Wikan 06.01.2013 21:33
Wikan
Ale kdyz ja opravdu nevim jak... :(
klikihak 06.01.2013 21:37
klikihak
rgbValues(counter) = hodnota_prislusneho_bytu
Wikan 06.01.2013 21:38
Wikan
A ukazete mi prosim, jak by mel tedy vypadat tento kod: For counter As Integer = 0 To rgbValues.Leng…
klikihak 06.01.2013 21:40
klikihak
Jeden byte nastavíš na 255, druhý na 174, třetí na 201. To už se ale opakujeme.
Wikan 06.01.2013 21:42
Wikan
Ale ja nevim jak rozsirit ten kod abych mohl zadat i tu trti hodnotu, rikam vam, ze to proste neumim…
klikihak 06.01.2013 21:43
klikihak
For counter As Integer = 0 To rgbValues.Length - 1 Step 4 rgbValues(counter) = hodnota_B rgbValues(c…
Wikan 06.01.2013 21:49
Wikan
Dobre, tak dekuji a omlouvam se... Preji hezkdy zbytek dne, dobrou noc a stastny zivot :) poslední
klikihak 06.01.2013 21:50
klikihak
Private Sub Example_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
    If Form2.Button2.BackColor = Color.Red Then
        Dim rect As New Rectangle(0, 0, _zkouska1.Width, _zkouska1.Height)
        Dim bmpData As System.Drawing.Imaging.BitmapData = _zkouska1.LockBits(rect, Drawing.Imaging.ImageLockMode.ReadWrite, _zkouska1.PixelFormat)

        ' Get the address of the first line. 
        Dim ptr As IntPtr = bmpData.Scan0

        ' Declare an array to hold the bytes of the bitmap. 
        ' This code is specific to a bitmap with 24 bits per pixels. 
        Dim bytes As Integer = Math.Abs(bmpData.Stride) * bmp.Height
        Dim rgbValues(bytes - 1) As Byte 

        ' Copy the RGB values into the array.
        System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes)

        ' Set every third value to 255. A 24bpp image will look red. 
        For counter As Integer = 0 To rgbValues.Length - 1
            If counter Mod 3 = 2 Then
                rgbValues(counter) = 255
            Else
                rgbValues(counter) = 0
            End If
        Next 

        ' Copy the RGB values back to the bitmap
        System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes)

        ' Unlock the bits.
        _zkouska1.UnlockBits(bmpData)
    End If
End Sub

Pak to jen překreslíš v události Paint.

Ano! To je ono! Vyborne! Dekuji! Omlouvam se za nedorozumeni.
Jen jeste jeden dotaz, jak udelat aby se takto ten obrazek prebarvoval podle toho jakou bude mit ten button2 barvu. Mam tim na mysli, aby kdyz bude modry, prebarvilo se to modre, kdyz bude zeleny, zelene, kdyz bude zluty, zlute atd...

A jak tedy nastavim napriklad (255, 174, 201)?
A neslo by aby to bylo automaticky nejak pridat toto akort misto s RED na BLUE atd??

If Form2.Button2.BackColor = Color.Red Then
Dim rect As New Rectangle(0, 0, _zkouska1.Width, _zkouska1.Height)
Dim bmpData As System.Drawing.Imaging.BitmapData = _zkouska1.LockBits(rect, Drawing.Imaging.ImageLockMode.ReadWrite, _zkouska1.PixelFormat)

' Get the address of the first line.
Dim ptr As IntPtr = bmpData.Scan0

' Declare an array to hold the bytes of the bitmap.
' This code is specific to a bitmap with 24 bits per pixels.
Dim bytes As Integer = Math.Abs(bmpData.Stride) * _zkouska1.Height
Dim rgbValues(bytes - 1) As Byte

' Copy the RGB values into the array.
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes)

' Set every third value to 255. A 24bpp image will look red.
For counter As Integer = 0 To rgbValues.Length - 1
Dim modulo As Integer = counter Mod 4
If modulo = 3 Then
Continue For
End If
If modulo = 2 Then
rgbValues(counter) = 255
Else
rgbValues(counter) = 0
End If

Next

' Copy the RGB values back to the bitmap
System.Runtime.InteropServices.Marshal.Copy(rgbVal ues, 0, ptr, bytes)

' Unlock the bits.
_zkouska1.UnlockBits(bmpData)

Refresh()
End If

' Set every third value to 255. A 24bpp image will look red.
For counter As Integer = 0 To rgbValues.Length - 1
Dim modulo As Integer = counter Mod 4
If modulo = 3 Then
Continue For
End If
If modulo = 2 Then
rgbValues(counter) = 255
Else
rgbValues(counter) = 174
End If

A s tou treti hodnotou nevim co mam delat :(

' Set every third value to 255. A 24bpp image will look red.
For counter As Integer = 0 To rgbValues.Length 0
Dim modulo As Integer = counter Mod 4
Continue For
End If
If modulo = 2 Then
rgbValues(counter) = 255
Else
rgbValues(counter) = 174
Else
rgbValues(counter) = 201
End If

Neee, ja tomu fakt nerozumim :(

A ukazete mi prosim, jak by mel tedy vypadat tento kod:
For counter As Integer = 0 To rgbValues.Length - 1
Dim modulo As Integer = counter Mod 4
If modulo = 3 Then
Continue For
End If
If modulo = 2 Then
rgbValues(counter) = 255
Else
rgbValues(counter) = 0
End If

S touto hodnotou? 255, 174, 201

For counter As Integer = 0 To rgbValues.Length - 1 Step 4
    rgbValues(counter) = hodnota_B
    rgbValues(counter + 1) = hodnota_G
    rgbValues(counter + 2) = hodnota_R
End If

Ale to je naposled, co radím bez toho, aby jsi projevil vlastní snahu. Jakýkoliv dotaz v podobném stylu už budu ignorovat.

Zpět do poradny Odpovědět na původní otázku Nahoru