PDA

View Full Version : به دست آوردن تعداد پیکسل هررنگ در تصاویر بیت مپ



mehrdad.h
سه شنبه 21 بهمن 1393, 21:04 عصر
با سلام خدمت اساتید محترم
من تو پروژم نیاز دارم تعداد پیکسل هررنگ رو به صورت جداگانه داشته باشم(شکل زیر) که استفاده از دستوراتی مثل bmp.GetPixel(x,y) خیلی زمانبره
آیا راهی هست ک بتونم سریعتر تعداد پیکسل هررنگ رو بدست بیارم (تو بعضی از تصاویر ممکنه بیشتر از 200 تا رنگ داشته باشیم که خیلی زمانبره)
ممنون میشم کمکم کنید
128354

Mahmoud Zaad
سه شنبه 21 بهمن 1393, 21:24 عصر
با سلام
این لینک (http://www.codeproject.com/Tips/240428/Work-with-bitmap-faster-with-Csharp) رو یه نگاه بندازید.

NASA's Spaceman
چهارشنبه 22 بهمن 1393, 02:45 صبح
اول قبل از هر کاری باید رنگ ها رو به برنامت بشناسونی (الان دسترسی به ویژال استادیو ندارم برات کد بنویسم تو اینترنت سرچ کنی این ها رو هست)
یعنی رنگ های سیستم که یه لیست تقریبا بلند هست که شما بر اساس اون به برنامت هر رنگ رو میشناسونی (با استفاده از کد هگزادسیمال برا رنگ ها)
بعد که رنگ رو شناسوندی میای پیکسل به پیکسل عکس رو چک میکنی و مقادیر هگزادسیمالی که تو هر پیکسل بدست میاد رو با اون مقادیری که به برنامت شناسوندی چک میکنی و کد هگزا به هر کدوم که نزدیک تر بود یکی به اون رنگ اضافه میکنی
کار سختی نیست فقط یکمی طولانی هست انجام دادنش و اگه برنامه نویسی گرافیک توی سی شارپ بلد باشی خیلی راحت هست این روش برات در غیر اینصورت پیشنهاد من اینه که برنامه نویسی گرافیک تو سی شارپ رو مطالعه کنید
با سپاس Spaceman

mehrdad.h
چهارشنبه 22 بهمن 1393, 10:19 صبح
با سلام
این لینک (http://www.codeproject.com/Tips/240428/Work-with-bitmap-faster-with-Csharp) رو یه نگاه بندازید.

منونم دوست عزیز از راهنماییتون
از این کلاس قبلا استفاده کردم ولی نتونستم تعداد پیکسل هر رنگ رو برگردونم . نمیدونم کجا اشتباه میکردم
ممنون میشم بیشتر راهنمایی کنید

amin1softco
چهارشنبه 22 بهمن 1393, 10:34 صبح
int count = 0;
HashSet<Color> colors = new HashSet<Color>();
Bitmap bmp = null;

if (File.Exists(fileName))
{
try
{
bmp = new Bitmap(fileName);
if (bmp != null)
{
for (int y = 0; y < bmp.Size.Height; y++)
{
for (int x = 0; x < bmp.Size.Width; x++)
{
colors.Add(bmp.GetPixel(x, y));
}
}
count = colors.Count;
}
}
catch
{
throw;
}
finally
{
colors.Clear();
bmp.Dispose();
}
}

mehrdad.h
چهارشنبه 22 بهمن 1393, 10:46 صبح
int count = 0;
HashSet<Color> colors = new HashSet<Color>();
Bitmap bmp = null;

if (File.Exists(fileName))
{
try
{
bmp = new Bitmap(fileName);
if (bmp != null)
{
for (int y = 0; y < bmp.Size.Height; y++)
{
for (int x = 0; x < bmp.Size.Width; x++)
{
colors.Add(bmp.GetPixel(x, y));
}
}
count = colors.Count;
}
}
catch
{
throw;
}
finally
{
colors.Clear();
bmp.Dispose();
}
}


ممنون دوست عزیز از راهنماییتون
من با بدست آوردن رنگ ها مشکلی ندارم ، مشکل با بدست آوردن تعداد پیکسل در هر رنگه که با GetPixel(x,Y) 1 ، برای تصاویری که رنگشون زیاده خیلی زمان میبره

amin1softco
چهارشنبه 22 بهمن 1393, 11:29 صبح
دوست عزیز شما نوعش را به دیکشنری تغییر بدید با اضافه کردن یک شرط تعدادش را بدست بیارید

Dictionary<Color, int> colors = new Dictionary<Color, int>();
Bitmap bmp = null;
if (File.Exists(fileName))
{
try
{
bmp = new Bitmap(fileName);
if (bmp != null)
{
for (int y = 0; y < bmp.Size.Height; y++)
{
for (int x = 0; x < bmp.Size.Width; x++)
{
Color c=bmp.GetPixel(x, y);
if (colors.ContainsKey(c))
colors[c]++;
else colors.Add(c, 0);

}
}

}
}
catch
{
throw;
}
finally
{
// colors.Clear();
bmp.Dispose();
}
}

}
}