2015-07-31 2 views
0

У меня есть изображение ImageMagick ++, которое я хотел бы масштабировать до любой ширины и высоты, которые мне нравятся, а затем я хотел бы получить доступ к пикселам этого нового масштабированного изображения.Как постоянно масштабировать изображение ImageMagick ++ на Ubuntu?

Я хочу, чтобы операция масштабирования постоянно изменяла изображение. До сих пор существует четыре метода ImageMagick ++, которые звучат так, как будто они могут достичь этой операции масштабирования: resize(), sample(), scale() и transform(), но единственная, с которой я могу почти работать, - sample().

Проблема заключается в том, что когда я вызываю tMyImage.sample(), а затем читаю значения пикселей, изображение масштабируется только до высоты, которую я передаю ему, а затем ширина устанавливается в соответствии с исходным соотношением сторон.

Вот код, я использую:

Magick::Image tMyIMage(iOriginalWidth, iOriginalHeight, "BGRA", Magick::CharPixel, (void *)pSourceData); 
try { tImage.sample(Magick::Geometry(200, 50, 0, 0)); } 
catch { Magick::Exception &eException) 
{ 
    // This never happens... 
} 
tImage.modifyImage(); 
size_t nNewWidth = tImage.columns(); 
size_t nNewHeight = tImage.rows(); 
// At this point I would expect that nNewWidth is 200 and nNewHeight is 50 
// Instead, nNewHeight is 50 but nNewWidth is scaled according to the original aspect ratio 
// Note here that tImage.baseColumns() and tImage.baseRows() both return 0 
tImage.type(Magick::TrueColorType); 
const Magick::PixelPacket *pPixels = tImage.getConstPixels(0, 0, nNewWidth, nNewHeight); 
// Here I would expect that pPixels points to pixel data of a 200x50 pixel image 

Я новичок в ImageMagick ++, поэтому я уверен, что я должен делать что-то неправильно. Любая помощь очень ценится! Благодаря!

+0

' tImage' width & height вернет 0, так как вы импортировали пиксели в 'tMyIMage'. – emcconville

ответ

0

Я выяснил причину, что масштабирование не работает; по-видимому, по умолчанию в ImageMagick ++, чтобы не принимать точные размеры, которые вы используете, если в результате соотношение сторон изменится -_- Вы должны явно указать ImageMagick ++ принимать точные размеры при создании геометрии:

char szGeometry[64]; 
memset(&(szGeometry[0]), 0, sizeof(szGeometry)); 
snprintf(szGeometry, sizeof(szGeometry) - 1, "%ix%i!", iWidth, iHeight); 
Magick::Image tScaled(iOriginalWidth, iOriginalHeight, "BGRA", Magick::CharPixel, (void *)pSourceData); 
try { tScaled.sample(Magick::Geometry(szGeometry)); } 
catch (Magick::Exception &eException) 
{ 
    ... 
} 
Смежные вопросы