12.09.2008, 16:41 | #1 |
Участник
|
Изменение размера картинки
Есть картинки произвольного размера, их нужно привести к единому размеру (уменьшить) средствами Аксапты. Попробовал использовать метод resize класса Image, но качество результирующей картинки получается ужасным. Метод resize имеет третий параметр InterpolarMethod, но его изменение что-то не влияет на качество картинки.
Вопрос (точнее 2 вопроса): 1. Возможно ли заставить класс Image более качественно уменьшать картинку? 2. Есть ли в WinAPI функции, которые умеют качественно уменьшать картинку? (просьба в MSDN не посылать, знаю что там можно найти все, просто нет времени искать, нужно очень срочно. Если кто знает на память в какую сторону копать, подскажите) |
|
12.09.2008, 17:09 | #2 |
Участник
|
|
|
12.09.2008, 17:25 | #3 |
Ищущий знания...
|
X++: if (CompanyImage.Image) { pictureImage = new Image(); pictureImage.setData(CompanyImage.Image); pictureBMP.image(pictureImage); pictureBMP.widthValue(pictureImage.width()); pictureBMP.heightValue(pictureImage.height()); }
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем Последний раз редактировалось lev; 12.09.2008 в 17:28. |
|
12.09.2008, 18:12 | #4 |
Участник
|
А я все-таки "пошлю" на MSDN
Scaling an Image И пример использования добавлю. По нажатию на кнопку на форму выводятся два отмасштабированных изображения последнего активированного окна в Аксапте. Одно с применением функций WINAPI, другое с использованием метода resize() класса Image. Что называется, почувствуйте разницу
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Lucky13 (2). |
14.09.2008, 17:43 | #5 |
Участник
|
Цитата:
Сообщение от AndyD
А я все-таки "пошлю" на MSDN
Scaling an Image И пример использования добавлю. По нажатию на кнопку на форму выводятся два отмасштабированных изображения последнего активированного окна в Аксапте. Одно с применением функций WINAPI, другое с использованием метода resize() класса Image. Что называется, почувствуйте разницу Попробую заменить ее на StretchDIBits, она умеет работать с JPEG. |
|
15.09.2008, 10:01 | #6 |
Участник
|
А, собственно, зачем?
Для загрузки jpg можно использовать все тот же класс Image и из него получать необходимое изображение, которое дальше можно уже обрабатывать тем же самым образом.
__________________
Axapta v.3.0 sp5 kr2 |
|
15.09.2008, 11:06 | #7 |
Участник
|
Действительно так проще, но результат все равно какой-то странный.
Если беру просто фотку, то все отлично. Если беру картинку, которую мне необходимо уменьшить, то получается вот так: Уменьшилось нормально, но что-то с цветом А должно быть вот так: Картинки мне что ли подсунули какие-то глючные Но что дали, то дали, нужно использовать именно их. В графических редакторах все уменьшается нормально. Чтобы это могло быть? Почему один JPEG обрабатывается нормально, а другой нет? |
|
15.09.2008, 11:33 | #8 |
Участник
|
Хм. Png у меня отобразился нормально.
Может, действительно что-то с jpg? А без масштабирования как оботражается?
__________________
Axapta v.3.0 sp5 kr2 |
|
15.09.2008, 14:06 | #9 |
Участник
|
Без масштабирования тоже также. Похоже это нелюбовь класса Image к конкретным видам JPEG . Отличий не нашел. Попробуйте у себя масштабировать файлы, прикрепленные к моему придыдущему сообщению. Будет ли наблюдаться подобный эффект?
|
|
15.09.2008, 15:10 | #10 |
Участник
|
Orig.png из предыдущего сообщиния у меня отображается нормально
__________________
Axapta v.3.0 sp5 kr2 |
|
15.09.2008, 16:08 | #11 |
Участник
|
В общем у меня есть 2 десятка jpg-файлов, которые неправильно отображаются, остальные нормально. Будем считать, что это неизвестный глюк
|
|
18.11.2008, 14:25 | #12 |
Участник
|
Решил использовать вместо функции StretchBlt функцию AlphaBlend
X++: boolean AlphaBlend(int hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, int hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, int percent) { DLL _dll = new DLL("msimg32.dll"); DLLFunction _alphaBlend = new DLLFunction(_dll, "AlphaBlend"); Binary blendFunc = new Binary(4); ; _alphaBlend.arg(ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::Pointer); _alphaBlend.returns(ExtTypes::DWord); blendFunc.byte(0, 0); blendFunc.byte(1, 0); blendFunc.byte(2, percent); blendFunc.byte(3, 0); return _alphaBlend.call(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, blendFunc); } X++: logo.loadImage('c:\\zg.bmp'); wDC = GetDC(0); newDC = CreateCompatibleDC(wDC); hBitmap = CreateCompatibleBitmap(wDC, 115, 111); if (hBitmap && SelectObject(newDC, hBitmap)) { logo.displayImage(newDC, 0,0,0,115,111); res = AlphaBlend(dstDC, 0,0,115,111,newDc,0,0,115,111, 128); // res = StretchBlt(dstDC, 0,0,115,111,newDc,0,0,115,111, #SRCCOPY); } Похожий код на С прекрасно работает X++: void DrawAlphaBlend (HDC hdcwnd) { HDC bmpDC; DWORD dw; HBITMAP hBitmap; LPCWSTR bmpName = _T("c:\\zg.bmp"); BLENDFUNCTION bf; bmpDC = CreateCompatibleDC(hdcwnd); hBitmap = (HBITMAP)LoadImage(hInst, bmpName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); SelectObject(bmpDC, hBitmap); bf.BlendOp = AC_SRC_OVER; bf.BlendFlags = 0; bf.SourceConstantAlpha = 0x7f; bf.AlphaFormat = 0; //StretchBlt(hdcwnd, 0,0, 115, 111, bmpDC, 0, 0, 115, 111, SRCCOPY); AlphaBlend(hdcwnd, 0, 0, 115, 111, bmpDC, 0, 0, 115, 111, bf); } |
|
05.03.2015, 13:01 | #13 |
Участник
|
Подниму тему, у меня также при использовании функции StretchBlt часть файлов формата jpg не отображается при выгрузке в Excel. Дополнительно при использовании функции StretchBlt не получается в Excel включить опцию прозрачности.
Функция AlphaBlend не срабатывает. Resize класса Image при изменении размера картинки дает ужасное качество конечного изображения. Есть еще какие-нибудь варианты изменять изображение в Аксапте (для вставки в Excel)? |
|
05.03.2015, 16:10 | #14 |
Талантливый разгвоздяй
|
Если речь про AX 2012 то советую присмотреться к классу EcoResProductImageManagement, он используется для отображения уменьшенных версий изображений в форме Используемые продукты" в режиме просмотра деталей продукта (Управление сведениями о продукте / Обычный / Используемые продукты, дважды кликнуть на номенклатуру, откроется форма), есть контрол ProductImage, в который загружается картинка прикрепленная к записи в форме через документооборот вот так:
X++: //Источник: \Forms\EcoResProductDetailsExtended\Data Sources\InventTable\Methods\selectionChanged
productImageManagement = EcoResProductImageManagement::newFromCommon(inventTable);
productImageManagement.loadProductImage(productImage); upd: тема-то стара как этот мир.. не буду стирать пост, хотя понимаю что он не актуален уже. |
|
05.03.2015, 16:32 | #15 |
Участник
|
Цитата:
Сообщение от Kabardian
Если речь про AX 2012 то советую присмотреться к классу EcoResProductImageManagement, он используется для отображения уменьшенных версий изображений в форме Используемые продукты" в режиме просмотра деталей продукта (Управление сведениями о продукте / Обычный / Используемые продукты, дважды кликнуть на номенклатуру, откроется форма), есть контрол ProductImage, в который загружается картинка прикрепленная к записи в форме через документооборот вот так:
X++: //Источник: \Forms\EcoResProductDetailsExtended\Data Sources\InventTable\Methods\selectionChanged
productImageManagement = EcoResProductImageManagement::newFromCommon(inventTable);
productImageManagement.loadProductImage(productImage); upd: тема-то стара как этот мир.. не буду стирать пост, хотя понимаю что он не актуален уже. |
|
12.03.2015, 12:15 | #16 |
Участник
|
Добрый день!
Пока остановились на том, что будут загружаться уже подготовленные картинки. А занимался ли кто-нибудь обратной процедурой - загрузку картинок из Excel в Аксапту? Axapta 3.0 |
|
Теги |
image, jpg, resize, winapi, картинка |
|
|