2013-10-25 2 views
2

Я сделал программу, чтобы получить все цветовые коды RGB с изображением. В принципе, он устанавливает y-позицию на константу и меняет положение x на нуль на ширину, а также y путем циклирования.Получить всю информацию о пикселях изображения эффективно

Хорошо, это работает, но проблема заключается в том, что для получения всего пикселя с высоты (1000 * 604 высоты) требуется всего 20 минут. Пожалуйста, помогите?

Я удивлен, если этот процесс длится так долго, то как мы можем сделать программу, такую ​​как считыватель штрих-кода из изображения. Я хочу получить все значения пикселей из изображения, вот мой код C# ниже.

Я также загрузил свою программу here, проверьте ее, если вы не согласны.

void myimage() { 

     mypic = new Bitmap(pathname); 
     int imwid = mypic.Width; 
     int imhei = mypic.Height; 
     int total=imwid*imhei; 

     for (int z = 0; z <imhei;z++) 
     { 
      for (int i = 0; i < imwid; i++) 
      { 
       Color pixelColor = mypic.GetPixel(i, z); 

       textBox2.AppendText(" " + pixelColor.R + 
        "  " + pixelColor.G + 
        "  " + pixelColor.B + "  " + 
        pixelColor.A + 
        Environment.NewLine); 
      } 
     } 
    } 
+2

Возможный дубликат [C# Обработка изображений с помощью блокировки, альтернатива getpixel?] (Http://stackoverflow.com/questions/12168654/c-sharp-image-processing-with-lockbits-alternative-to-getpixel) – CodeCaster

+3

Кроме того, вызывать 'TextBox.AppendText' несколько десятков тысяч раз медленнее. Используйте 'StringBuilder'. – CodeCaster

+1

Кроме того, «как мы создаем программу, такую ​​как считыватель штрих-кода из изображения» _, не изобретайте велосипед: см. [Рекомендовать библиотеку чтения штрих-кода .NET с открытым исходным кодом] (http://stackoverflow.com/questions/ 191192/рекомендую-ан-открытый источник-нетто-штрих-читатель-библиотеку). – CodeCaster

ответ

2

Взгляните на это:

var data = mypic.LockBits(
    new Rectangle(Point.Empty, mypic.Size), 
    ImageLockMode.ReadWrite, mypic.PixelFormat); 
var pixelSize = data.PixelFormat == PixelFormat.Format32bppArgb ? 4 : 3; // only works with 32 or 24 pixel-size bitmap! 
var padding = data.Stride - (data.Width * pixelSize); 
var bytes = new byte[data.Height * data.Stride]; 

// copy the bytes from bitmap to array 
Marshal.Copy(data.Scan0, bytes, 0, bytes.Length); 

var index = 0; 
var builder = new StringBuilder(); 

for (var y = 0; y < data.Height; y++) 
{ 
    for (var x = 0; x < data.Width; x++) 
    { 
     Color pixelColor = Color.FromArgb(
      pixelSize == 3 ? 255 : bytes[index + 3], // A component if present 
      bytes[index + 2], // R component 
      bytes[index + 1], // G component 
      bytes[index]  // B component 
      ); 

     builder 
      .Append(" ") 
      .Append(pixelColor.R) 
      .Append("  ") 
      .Append(pixelColor.G) 
      .Append("  ") 
      .Append(pixelColor.B) 
      .Append("  ") 
      .Append(pixelColor.A) 
      .AppendLine(); 

     index += pixelSize; 
    } 

    index += padding; 
} 

// copy back the bytes from array to the bitmap 
Marshal.Copy(bytes, 0, data.Scan0, bytes.Length); 

textBox2.Text = builder.ToString(); 

это просто пример, читать некоторые хорошие учебники о LockBits и визуализации в целом, чтобы четко понимать, что происходит.

+1

Alessandro D'Andria я рад за ответ. Я узнаю больше о LOCKBITS. –

+1

Я знаю, как я пытаюсь это сделать, это точно неправильно. Я нашел артистическое http://www.mfranc.com/programming/operacje-na-bitmapkach-net-1/ спасибо –

+0

Пожалуйста, не забывайте чтобы разблокировать заблокированные биты. Кроме того, массив байтов не модифицируется; нет никакой причины копировать его обратно в изображение. – Nyerguds

1

Получение информации о пикселях не должно длиться так долго. Можете ли вы записать время, которое требуется для запуска myimage()? Медленность может быть где-то в другом месте. Также попробуйте удалить строку, начинающуюся с textBox2.AppendText в myimage() и посмотреть, как быстро она работает.

+2

'GetPixel' занимает длительное время исполнения. Использование «LockBits» - это способ сделать это. – joe

+0

Я согласен, что '' LockBits'' быстрее, но, по моему опыту, 'GetPixel' не занимает 20 минут на таком маленьком изображении. На что он работает? Исходный ПК с производительностью 4,77 МГц? – acfrancis

+1

Подождите ... точно нет моего компьютера (intel core 2 do, 4gb ram), и я пробовал его на моем основном ноутбуке ноутбука i5 ASUS, но проблема такая же .. действительно счастливая вещь - это exute как минимум 20 минут, а также получить не отвечая .. и я пытаюсь разные изображения некоторые большие. i использовано изображение 704 ширина-1400 высота он не реагирует на обоих кругах и pc проверьте, не согласны ли вы. i повысил его http: //www.mediafire. com /? 7etr90i4hqkoa2q –

Смежные вопросы