PDA

View Full Version : اضافه کردن یک لایه به عکس



rsheytoonak
یک شنبه 19 اسفند 1386, 00:59 صبح
سلام
من یه عکس رو ریختم تو یه متغیر از نوه image حلا میخام رنگ تک تک پیکسل ها رو بگیرم به رنگ مثلآ آبیش 5 واحد اضافه کنم یعنی یه لایه آبی بکشم رو عکس بعد تو یه picturebox نشونش بدم کسی میتونه راهنماییم کنه

tthenry14plus
یک شنبه 19 اسفند 1386, 02:35 صبح
using System.Drawing.Imaging;



Bitmap bmp = new Bitmap(picturebox1.Image);

//read
Color c = bmp.GetPixel(1, 1);

//write
bmp.SetPixel(2, 2, c);




private void GetPixel_Example(PaintEventArgs e)
{

// Create a Bitmap object from an image file.
Bitmap myBitmap = new Bitmap("Grapes.jpg");

// Get the color of a pixel within myBitmap.
Color pixelColor = myBitmap.GetPixel(50, 50);

// Fill a rectangle with pixelColor.
SolidBrush pixelBrush = new SolidBrush(pixelColor);
e.Graphics.FillRectangle(pixelBrush, 0, 0, 100, 100);
}

به نقل از آقای SinPin و ایشون به نقل از :

‌ http://msdn2.microsoft.com/en-us/library/system.drawing.bitmap.getpixel.aspx (http://barnamenevis.org/forum/‌ http://msdn2.microsoft.com/en-us/library/system.drawing.bitmap.getpixel.aspx)

m.doostdar
دوشنبه 20 اسفند 1386, 01:10 صبح
سلام
من 1 برنامه نوشتم که 1 عکس رو باز میکنه و 4 تا ترک ویو برا رنگای قرمز و ابی و سبز و الفا

با حرکت دادن این ترک ویو ها عکس لایه ای به همون رنگ میگیره
حالا مسئله اینجاس که سرعتش خیلی کمه
این کد منه

Image img;
Color c;
public Form2()
{
InitializeComponent();

}
privatevoid button1_Click(object sender, EventArgs e)
{

if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
img = System.Drawing.Image.FromFile(openFileDialog1.File Name);
pictureBox1.Image = img;
pictureBox2.Image = img;
button1.Text = trackBar1.Value.ToString() + "," + trackBar2.Value.ToString() + "," + trackBar3.Value.ToString() + "," + trackBar1.Value.ToString();
trackBar1.Enabled = trackBar2.Enabled = trackBar3.Enabled = trackBar4.Enabled = true;
trackBar5.Enabled = trackBar6.Enabled = trackBar7.Enabled = trackBar8.Enabled = true;
}
}
privatevoid trackBar1_ValueChanged(object sender, EventArgs e)
{
Bitmap bmp = newBitmap(img);
pictureBox1.Image = img;
for (int i = 1; i < img.Width; i++)
for (int j = 1; j < img.Height; j++)
{
c = bmp.GetPixel(i, j);
c.ToArgb();
c = Color.FromArgb(trackBar1.Value, bmp.GetPixel(i, j).R, bmp.GetPixel(i, j).G, bmp.GetPixel(i, j).B);
bmp.SetPixel(i, j, c);
}
pictureBox2.Image = bmp;
button1.Text = trackBar1.Value.ToString() + "," + trackBar2.Value.ToString() + "," + trackBar3.Value.ToString() + "," + trackBar1.Value.ToString();
}
privatevoid trackBar2_ValueChanged(object sender, EventArgs e)
{
Bitmap bmp = newBitmap(img);
pictureBox1.Image = img;
for (int i = 1; i < img.Width; i++)
for (int j = 1; j < img.Height; j++)
{
c = bmp.GetPixel(i, j);
c.ToArgb();
c = Color.FromArgb(bmp.GetPixel(i, j).A, bmp.GetPixel(i, j).R, trackBar2.Value, bmp.GetPixel(i, j).B);

bmp.SetPixel(i, j, c);
}
pictureBox2.Image = bmp;
button1.Text = trackBar1.Value.ToString() + "," + trackBar2.Value.ToString() + "," + trackBar3.Value.ToString() + "," + trackBar1.Value.ToString();

}
privatevoid trackBar3_ValueChanged(object sender, EventArgs e)
{
Bitmap bmp = newBitmap(img);
pictureBox1.Image = img;
for (int i = 1; i < img.Width; i++)
for (int j = 1; j < img.Height; j++)
{
c = bmp.GetPixel(i, j);
c.ToArgb();
c = Color.FromArgb(bmp.GetPixel(i, j).A, trackBar3.Value, bmp.GetPixel(i, j).G, bmp.GetPixel(i, j).B);

bmp.SetPixel(i, j, c);
}
pictureBox2.Image = bmp;
button1.Text = trackBar1.Value.ToString() + "," + trackBar2.Value.ToString() + "," + trackBar3.Value.ToString() + "," + trackBar1.Value.ToString();
}
privatevoid trackBar4_ValueChanged(object sender, EventArgs e)
{
Bitmap bmp = newBitmap(img);
pictureBox1.Image = img;
for (int i = 1; i < img.Width; i++)
for (int j = 1; j < img.Height; j++)
{
c = bmp.GetPixel(i, j);
c.ToArgb();
c = Color.FromArgb(bmp.GetPixel(i, j).A, bmp.GetPixel(i, j).R, bmp.GetPixel(i, j).G, trackBar4.Value);
bmp.SetPixel(i, j, c);
}
pictureBox2.Image = bmp;
button1.Text = trackBar1.Value.ToString() + "," + trackBar2.Value.ToString() + "," + trackBar3.Value.ToString() + "," + trackBar1.Value.ToString();

}


تقریبا 10-15 ثانیه طول میکشه تا جواب بده که خیلی زیاده

tthenry14plus
دوشنبه 20 اسفند 1386, 02:28 صبح
خوب مسلمه، شما از دوحلقه تودرتو استفاده کردید و داخل حلقه هم پیکسلو می خوانید و روش می نویسید، اگر تصویر 1024*768 هم باشه خودت حساب کن ببین چندبار باید این کارو انجام بده. یک مشکل ویژوال استادیو همین سرعتشه در مورد کارهای گرافیکی.

m.doostdar
چهارشنبه 22 اسفند 1386, 01:08 صبح
منم همینو میگم راه دیگهای نداره؟؟؟
تابعی یا کامپوننتی یا هر چیزی که سرعت کار رو ببره بالا اخه اینجوری که نمیشه!!!

m.doostdar
چهارشنبه 22 اسفند 1386, 01:22 صبح
الان 1 فکری به سرم زد
میشه تو 1 صفحه جدا اندازه عکسو کوچیک کرد بعد رنگا رو بهش اعمال کرد و بعد از زدن دکمه save نتیجه رو فرم اصلی با اندازه واقعی عکس نشون داده بشه
اینجوری فقط 1 بار طول میکشه تا افکت اعمال بشه
اما اندازه عکسو چطوری کوچیک کنم؟؟؟
میشه کمکم کنید؟؟؟

Amir Oveisi
چهارشنبه 22 اسفند 1386, 22:47 عصر
you can use multithreading to speed up

Alireza_Salehi
چهارشنبه 22 اسفند 1386, 23:00 عصر
سریع ترین راه برای دستکاری تصویر در دات نت (#C) استفاده از بلوک unsafe و متد LockBits (http://msdn2.microsoft.com/en-us/library/system.drawing.bitmap.lockbits.aspx)و UnlockBits (http://msdn2.microsoft.com/en-us/library/system.drawing.bitmap.unlockbits.aspx)کلاس System.Drawing.Bitmap (http://msdn2.microsoft.com/en-us/library/system.drawing.bitmap.aspx)است!
در اکثر کتابخانه های پردازش تصویر از این روش استفاده شده است.

مثال: Faster pixel manipulation (http://www.mdibb.net/net/faster_pixel_manipulation_with_getpixel_and_setpix el_in_net/)