2010-09-07 3 views
0

Как преобразовать одноканальный IplImage (оттенки серого), depth = 8, в растровое изображение? Следующий код запускается, но отображает изображение в 256 цветном, а не в оттенках серого. (Цвет очень отличается от оригинала)Как преобразовать Single Channel IplImage * в Bitmap^

btmap = gcnew Bitmap(
cvImg->width , 
cvImg->height , 
cvImg->widthStep , 
System::Drawing::Imaging::PixelFormat::Format8bppIndexed, 
(System::IntPtr)cvImg->imageData) 
; 

Я считаю, что моя проблема заключается в PixelFormat. Ive попытался масштабировать изображение до 16 бит и установил формат пикселей в 16bppGrayscale, но это приведет к сбою формы при загрузке изображения.

Место назначения - PicturePox в форме C#. Спасибо.

ответ

1

Вам необходимо создать экземпляр ColorPalette, заполнить его палитрой оттенков серого и присвоить свойство btmap-> Palette.

Редактировать: На самом деле создание класса ColorPalette немного сложно, лучше изменить цветные записи непосредственно в btmap-> Palette. Установите эти записи в RGB (0,0,0), RGB (1,1,1) ... RGB (255,255,255). Что-то вроде этого:

 
ColorPalette^ palette = btmap->Palette; 


array<Color>^ entries = palette->Entries; 


for (int i = 0; i < 256; ++i) 

{ 

    entries[i] = Color::FromArgb(i, i, i); 

} 
+0

Сладкие, как. Применение этого созданного палитры к моему свойству btmap-> Palatte работает. Благодарю. 8hrs исследует против 20mins на stackoverflow. Спасибо Alex – sMaN

1
int intStride = (AfterHist.width * AfterHist.nChannels + 3) & -4; 
      Bitmap BMP = new Bitmap(AfterHist.width, 
          AfterHist.height, intStride, 
          PixelFormat.Format24bppRgb, AfterHist.imageData); 

этот путь является правильным, чтобы создать растровое изображение в IplImage.

-1

Моя реализация идеи Алекса (это C++ \ CLI, но легко преобразовать в C#):

System::Drawing::Bitmap ^btmp=gcnew System::Drawing::Bitmap(this->images[0]->width, 
    this->images[0]->height,this->images[0]->widthStep, 
    System::Drawing::Imaging::PixelFormat::Format8bppIndexed, 
    (System::IntPtr)this->images[0]->imageData); 
System::Drawing::Imaging::ColorPalette^ palette = btmp->Palette; 
for (int i = 0; i < 256; ++i) 
    palette->Entries[i] = Color::FromArgb(i, i, i); 
btmp->Palette=palette; 
this->pictureBox1->Image=btmp; 
+0

Добро пожаловать в переполнение стека, возможно, вы можете добавить описание вышеприведенного кода. Более полные ответы, скорее всего, будут полезны для других в будущем. stackoverflow.com/help/how-to-answer – Mack

+0

, пожалуйста, ответ на 4-летний вопрос - плохая идея в этом случае. в 2010 году они покончили с IplImages, сегодня никто не должен использовать этот код. – berak

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