@ColdSpirit

Как преобразовать изображение (imagick --> System.Drawing.Image) или альтернативы этому?

Доброго времени суток.
Создал "windows forms application", в нем есть pictureBox (окошко, в котором отображается картинка), нужно эту картинку размыть до показа в pictureBox.
Последовательность такая: загрузка файла, размытие где-то в памяти, отображение. Для размытия хочу использовать ImageMagick, но тут вопрос: как потом перенести эту imagick'овскую картинку в микрософтовский класс Image? Смотрел - вроде бы можно задать bitmap изображение пиксель за пикселем, но мне кажется это лишняя работа.
Есть ли какие-нибудь способы это сделать, или альтернативы?
  • Вопрос задан
  • 545 просмотров
Решения вопроса 1
@ColdSpirit Автор вопроса
Решил данный вопрос таким способом:
// load image from file
System::Drawing::Bitmap^ imageCLI_RGB = gcnew System::Drawing::Bitmap^(L"Lena.jpg");
 
 // resize image for change RGB to RGBA values
System::Drawing::Bitmap^ imageCLI_RGBA = gcnew System::Drawing::Bitmap(imageCLI_RGB, 640, 480);


 
 // lock the bitmap's bits. 
System::Drawing::Rectangle rect = System::Drawing::Rectangle(0, 0, imageCLI_RGBA->Width, imageCLI_RGBA->Height);
System::Drawing::Imaging::BitmapData^ bmpData = imageCLI_RGBA->LockBits(rect, System::Drawing::Imaging::ImageLockMode::ReadWrite, imageCLI_RGBA->PixelFormat);

 // get the address of the first line.
System::IntPtr ptr = bmpData->Scan0;

 // declare an array to hold the bytes of the bitmap.
 // this code is specific to a bitmap with 24 bits per pixels.
int bytes = System::Math::Abs(bmpData->Stride) * imageCLI_RGBA->Height;
array<System::Byte>^ rgbValues = gcnew array<System::Byte>(bytes);

 // copy the RGBA values into the array.
System::Runtime::InteropServices::Marshal::Copy(ptr, rgbValues, 0, bytes);



/***** ALL MAGICK HERE *****/

 // RGBA contains CLI char array to simple char array
pin_ptr<unsigned char> p = &rgbValues[0];
unsigned char* rgbaTable = p;

 // add RGBA values to ImageMagick image
Magick::Image* imageIM = new Magick::Image(imageCLI_RGBA->Width, imageCLI_RGBA->Height, "RGBA", Magick::CharPixel, rgbaTable);

 // blur image
imageIM->gaussianBlur(3, 2);

 // copy values back to the RGBA array
imageIM->write(0, 0, imageCLI_RGBA->Width, imageCLI_RGBA->Height, "RGBA", Magick::CharPixel, rgbaTable);
delete imageIM;

/***** END MAGICK *****/



 // copy array to image
System::Runtime::InteropServices::Marshal::Copy(rgbValues, 0, ptr, bytes);

 // unlock the bits.
imageCLI_RGBA->UnlockBits(bmpData);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы