Forum » Programiranje » [c#] Spreminjanje barve v sliki
[c#] Spreminjanje barve v sliki
HellRaiseR ::
Imam naslednji problem, ki ga nikakor ne znam rešiti. Pri določeni sliki, bi rad popravil odtenek zelene barve(slika je sestavljena samo iz zelene in črne barve), zato sem napisal preprost programček, ki popravi odtenek zelene, če le ta ni pravi. Takole zgleda glavni del programa.
private void btnZacni_Click(object sender, EventArgs e)
{
int stzamenjav = 0;
if (tbIzovrnaDatoteka.Text == String.Empty) return;
Bitmap slika = new Bitmap(tbIzovrnaDatoteka.Text);
Bitmap novaslika = new Bitmap(slika.Width, slika.Height);
for (int visina = 0; visina < slika.Height; visina++)
{
for (int sirina = 0; sirina < slika.Width; sirina++)
{
int barva = slika.GetPixel(sirina, visina).ToArgb();
if (barva != _crna && barva != _zelena)
{
stzamenjav++;
novaslika.SetPixel(sirina, visina, Color.FromArgb(_zelena));
}
else
{
novaslika.SetPixel(sirina, visina, Color.FromArgb(barva));
}
}
}
novaslika.Save("C:\\nova5.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
MessageBox.Show("Koncano! St. zamenjav: " + stzamenjav);
}
Program sicer dela vredu in zamenja barvo, vendar pa shrani 24bitno sliko, sam pa rabim 8bitno sliko. Ko zadevo recimo odprem v slikarju in shranim kot 256 barvno sliko, se potem odtenek zelene barve zamenja, kar bi sicer bilo razumljivo, če ne bi bil ta odtenek zelene pravzaprav vzet iz druge 8bitne slike, torej bi po vsej logiki moral obstajati in ga program nebi smel zamenjati. Ima mogoče kdo idejo kaj sem spregledal, ker sam z raznimi formati slik nimam izkušenj.
private void btnZacni_Click(object sender, EventArgs e)
{
int stzamenjav = 0;
if (tbIzovrnaDatoteka.Text == String.Empty) return;
Bitmap slika = new Bitmap(tbIzovrnaDatoteka.Text);
Bitmap novaslika = new Bitmap(slika.Width, slika.Height);
for (int visina = 0; visina < slika.Height; visina++)
{
for (int sirina = 0; sirina < slika.Width; sirina++)
{
int barva = slika.GetPixel(sirina, visina).ToArgb();
if (barva != _crna && barva != _zelena)
{
stzamenjav++;
novaslika.SetPixel(sirina, visina, Color.FromArgb(_zelena));
}
else
{
novaslika.SetPixel(sirina, visina, Color.FromArgb(barva));
}
}
}
novaslika.Save("C:\\nova5.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
MessageBox.Show("Koncano! St. zamenjav: " + stzamenjav);
}
Program sicer dela vredu in zamenja barvo, vendar pa shrani 24bitno sliko, sam pa rabim 8bitno sliko. Ko zadevo recimo odprem v slikarju in shranim kot 256 barvno sliko, se potem odtenek zelene barve zamenja, kar bi sicer bilo razumljivo, če ne bi bil ta odtenek zelene pravzaprav vzet iz druge 8bitne slike, torej bi po vsej logiki moral obstajati in ga program nebi smel zamenjati. Ima mogoče kdo idejo kaj sem spregledal, ker sam z raznimi formati slik nimam izkušenj.
darkolord ::
Eden od konstruktorjev za Bitmap sprejme parameter tipa PixelFormat - tam lahko izbereš, da bo slika 8 bitna.
rookie123 ::
Mene pa zanima, kako bi sliki, ki jo dobim od uporabnika zmanjšal velikost na določeno število piksov, da bi potem zmanjšano dal v bazo. Ima kdo kak predlog?
Koda za prebrano sliko, ki jo shranim v bazo pa je tu:
public void OnUpload(Object sender, EventArgs e)
{
// Create a byte[] from the input file
int len = Upload.PostedFile.ContentLength;
byte[] pic = new byte[len];
Upload.PostedFile.InputStream.Read (pic, 0, len);
// Insert the image and comment into the database
SqlConnection connection = new
SqlConnection (@"server=INDIA\INDIA;database=iSense;uid=sa;pwd=india");
try
{
connection.Open ();
SqlCommand cmd = new SqlCommand ("insert into Image "
+ "(Picture, Comment) values (@pic, @text)", connection);
cmd.Parameters.Add ("@pic", pic);
cmd.Parameters.Add ("@text", Comment.Text);
cmd.ExecuteNonQuery ();
}
finally
{
connection.Close ();
}
}
Koda za prebrano sliko, ki jo shranim v bazo pa je tu:
public void OnUpload(Object sender, EventArgs e)
{
// Create a byte[] from the input file
int len = Upload.PostedFile.ContentLength;
byte[] pic = new byte[len];
Upload.PostedFile.InputStream.Read (pic, 0, len);
// Insert the image and comment into the database
SqlConnection connection = new
SqlConnection (@"server=INDIA\INDIA;database=iSense;uid=sa;pwd=india");
try
{
connection.Open ();
SqlCommand cmd = new SqlCommand ("insert into Image "
+ "(Picture, Comment) values (@pic, @text)", connection);
cmd.Parameters.Add ("@pic", pic);
cmd.Parameters.Add ("@text", Comment.Text);
cmd.ExecuteNonQuery ();
}
finally
{
connection.Close ();
}
}
Zgodovina sprememb…
- spremenil: rookie123 ()
darkolord ::
Konstruktorju za Bitmap lahko podaš stream. Potem pa uporabiš nekaj takega za resize:
public Bitmap ResizeBitmap( Bitmap b, int nWidth, int nHeight ) { Bitmap result = new Bitmap( nWidth, nHeight ); using( Graphics g = Graphics.FromImage( (Image) result ) ) g.DrawImage( b, 0, 0, nWidth, nHeight ); return result; }
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [c#] picturebox, slika na slikoOddelek: Programiranje | 1104 (914) | japol |
» | C# INSERT statment ne vpise podatkovOddelek: Programiranje | 1225 (1099) | darkolord |
» | [Visual C#] TableAdapterOddelek: Programiranje | 1163 (1039) | detroit |
» | Statistika dijakov, pomocOddelek: Programiranje | 1814 (1298) | Mitja Bonča |
» | [C#] Query in codeOddelek: Programiranje | 1843 (1587) | iggy1 |