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
Snažil jsem se hodně, ale stejně jsem nepochopil, co vlastně chceš.
Mám kód který jsem zde vložil, kteý mi po spuštění vykreslí na obrazovku Bitmap.
Já potřebuji udělat to, aby když na tento bitmap kliknu, tak aby se mi jeho barva zmenila na tu barvu, kterou má Button2 na Formě2.
Tady máš příklad jak upravit Bitmapu:
http://msdn.microsoft.com/en-us/library/5ey6h79d.a spx
A nevis prosim jak by mel tedy vypadat ten muj kod aby to fungovalo tak jak potrebuju? Jsem uz zoufalej :(
Uprav ho podle toho příkladu.
Ja to nedokazu, jsem vazne zacatecnik... Prosim, pomoz mi, uz se v tom babram hrozne dlouho :(
Pak to jen překreslíš v události Paint.
Dekuji moc, ale podtrhlo mi to text bmp tady:
Dim bytes As Integer = Math.Abs(bmpData.Stride) * bmp.Height
Dim rgbValues(bytes - 1) As Byte
A co znamena to prekleslit v udalosti paint? Jak to udelam?
´bmp´ is not declared. It may be inaccessible due to its protection level.
Dim bytes As Integer = Math.Abs(bmpData.Stride) * _zkouska1.Height
Událost Paint už tam obsluhuješ (i když teda netuším, jak jsi to dokázal, když nevíš, co to je), takže snad nebudeš muset dělat nic.
Takze ted kdyz kliknu na tu Bitmapu _zkouska jedna a button2 je cerveny, melo by mi tu bitmapu zmenit do cervene, nebo s tim musim este neco udelat? protoze kdyz kliknu tak ji to ted nezbarvi...
Zkus ještě na konec dát Refresh()
Kdyz jsem napsal refresh() a spustil, kliknul, objevi se mi toto:
d9145872a1
Tak změň:
Na:
Ted to zas podtrhlo vlnovkou to cilo: 16711680
(Constant expression not representable in type ´Byte´.)
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 fungovat.
windows mi píše že je to bitová hloubka 32 ale já to exportoval z Corel Draw ve 24bitech...
Zkusil jsem to, funguje mi to. Problém bude v původním obrázku.
45d894be6d Tady je můj obrázek, je tedy špatný?
Je 32bitový. Pro něj budu fungovat tohle:
Jenomze ted se mi prebarvil cely ten obdelnik, ne jenom samotny tvar, tobe se prebarvil jenom ten tvar a pozadi zustalo nedotceny? 008dc1eb38
O tom jsi nepsal.
Ano, barva toho bitmapu ve tvaru toho bitmapu samozrejme...
Coo?
No ten bitmap co jsem vam posilal je takovy sedy pazourek na bilem/pruhlednem pozadi, ja potrebuji aby se zmenil na cervenou barvu jenom ten "pazourek" bez toho bílého0průhledného pozadí...
Je to problem? :(
Problém ne, jenom nesmysl. Co konkrétně se má přebarvit?
aby to vypadalo takto: 88054963b0
a ne takto: 008dc1eb38
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...
Řádek
nastavuje jednotlivé ARGB hodnoty barvy obrázku. Takže si zjistíš jaké hodnoty má barva buttonu a podle toho to pak změníš. Ale to už nechám na tobě.
A nejak automaticky to nelze? kdyby se ta barva buttonu2 menila pri spustenem programu, aby reagovalo to prebarvovani automaticky na danou barvu?
O tom pochybuju.
ale ten radek na tu je tam jenom dvakrat, jak tedy mohu napsat R G i B?
Protože jeden pixel je tvořen 4 hodnotami v pořadí BGRA. A musíš správně nastavit všechny 4 hodnoty.
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
Automaticky nejde nikdy nic. Jeden byte nastavíš na 255, další na 174, další na 201.
ale porad nechapu jak, respektive kam to napsat...
Přečti si znovu, co jsem psal.
Ja opravdu nevim, netrapte me prosim...
Ale já opravdu nemám chuť za tebe všechno udělat. Dostal jsi dost informací k tomu, abys to za 5 minut dokázal udělat sám.
' 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 :(
Tenhle kód nastaví každou 3. hodnotu ze 4 na 255, první a druhou na 174. Čtvrtou přeskakuje.
' 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 :(
Víš vůbec jak se tvoří podmínky?
http://msdn.microsoft.com/en-us/library/752y8abs.a spx
Ja vam rikam ze jsem naprosty zacatecnik, prosim, jak to ma tedy vypadat? :(
Pokud za tebe všechno udělá někdo jiný, tak se vůbec nic nenaučíš.
Uvidim jak to ma vypadat spravne a z toho si dokazi odvodit proc to tak je ale takhle na to nikdy neprijdu...
Prosim...
Dobry den, vazim si vasi pomoci a ocenuji vasi ochotu, ale prozradite mi prosim, jak by mel vypadat ten kod pro vlozeni RGB? Predem dekuji za odpoved.
Tak znovu a naposled. Nastavíš jednotlivé byty na příslušné hodnoty.
Ale kdyz ja opravdu nevim jak... :(
rgbValues(counter) = hodnota_prislusneho_bytu
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
Jeden byte nastavíš na 255, druhý na 174, třetí na 201. To už se ale opakujeme.
Ale ja nevim jak rozsirit ten kod abych mohl zadat i tu trti hodnotu, rikam vam, ze to proste neumim, proto od vas potrebuji pomoct.
Ale to je naposled, co radím bez toho, aby jsi projevil vlastní snahu. Jakýkoliv dotaz v podobném stylu už budu ignorovat.
Dobre, tak dekuji a omlouvam se... Preji hezkdy zbytek dne, dobrou noc a stastny zivot :)