AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.09.2008, 16:41   #1  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Изменение размера картинки
Есть картинки произвольного размера, их нужно привести к единому размеру (уменьшить) средствами Аксапты. Попробовал использовать метод resize класса Image, но качество результирующей картинки получается ужасным. Метод resize имеет третий параметр InterpolarMethod, но его изменение что-то не влияет на качество картинки.
Вопрос (точнее 2 вопроса):

1. Возможно ли заставить класс Image более качественно уменьшать картинку?
2. Есть ли в WinAPI функции, которые умеют качественно уменьшать картинку? (просьба в MSDN не посылать, знаю что там можно найти все, просто нет времени искать, нужно очень срочно. Если кто знает на память в какую сторону копать, подскажите)
Старый 12.09.2008, 17:09   #2  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
а через .NET?
Старый 12.09.2008, 17:25   #3  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
X++:
if (CompanyImage.Image)
        {
            pictureImage = new Image();
            pictureImage.setData(CompanyImage.Image);
            pictureBMP.image(pictureImage);
            pictureBMP.widthValue(pictureImage.width());
            pictureBMP.heightValue(pictureImage.height());
        }
вот в таком варианте у нас хорошо показывает. pictureBMP - контрол на форме
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем

Последний раз редактировалось lev; 12.09.2008 в 17:28.
Старый 12.09.2008, 18:12   #4  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
А я все-таки "пошлю" на MSDN
Scaling an Image
И пример использования добавлю.
По нажатию на кнопку на форму выводятся два отмасштабированных изображения последнего активированного окна в Аксапте. Одно с применением функций WINAPI, другое с использованием метода resize() класса Image.
Что называется, почувствуйте разницу
Вложения
Тип файла: xpo StretchImageForm.xpo (17.4 Кб, 377 просмотров)
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Lucky13 (2).
Старый 14.09.2008, 17:43   #5  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Цитата:
Сообщение от AndyD Посмотреть сообщение
А я все-таки "пошлю" на MSDN
Scaling an Image
И пример использования добавлю.
По нажатию на кнопку на форму выводятся два отмасштабированных изображения последнего активированного окна в Аксапте. Одно с применением функций WINAPI, другое с использованием метода resize() класса Image.
Что называется, почувствуйте разницу
Все бы так "посылали". Спасибо AndyD, то что нужно. Только функция StretchBlt умеет работать только с bmp файлами, а мне они не подходят, слишком уж большие файлы будут.

Попробую заменить ее на StretchDIBits, она умеет работать с JPEG.
Старый 15.09.2008, 10:01   #6  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
А, собственно, зачем?
Для загрузки jpg можно использовать все тот же класс Image и из него получать необходимое изображение, которое дальше можно уже обрабатывать тем же самым образом.
Вложения
Тип файла: xpo StretchImageFromFileForm.xpo (44.8 Кб, 363 просмотров)
__________________
Axapta v.3.0 sp5 kr2
Старый 15.09.2008, 11:06   #7  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Цитата:
Сообщение от AndyD Посмотреть сообщение
А, собственно, зачем?
Действительно так проще, но результат все равно какой-то странный.

Если беру просто фотку, то все отлично.
Нажмите на изображение для увеличения
Название: good.png
Просмотров: 511
Размер:	91.4 Кб
ID:	3725

Если беру картинку, которую мне необходимо уменьшить, то получается вот так:
Нажмите на изображение для увеличения
Название: res.png
Просмотров: 406
Размер:	167.1 Кб
ID:	3727

Уменьшилось нормально, но что-то с цветом

А должно быть вот так:
Название: orig.png
Просмотров: 2455

Размер: 76.7 Кб

Картинки мне что ли подсунули какие-то глючные

Но что дали, то дали, нужно использовать именно их. В графических редакторах все уменьшается нормально.

Чтобы это могло быть? Почему один JPEG обрабатывается нормально, а другой нет?
Старый 15.09.2008, 11:33   #8  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Хм. Png у меня отобразился нормально.
Может, действительно что-то с jpg? А без масштабирования как оботражается?
__________________
Axapta v.3.0 sp5 kr2
Старый 15.09.2008, 14:06   #9  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Цитата:
Сообщение от AndyD Посмотреть сообщение
Хм. Png у меня отобразился нормально.
Может, действительно что-то с jpg? А без масштабирования как оботражается?
Без масштабирования тоже также. Похоже это нелюбовь класса Image к конкретным видам JPEG . Отличий не нашел. Попробуйте у себя масштабировать файлы, прикрепленные к моему придыдущему сообщению. Будет ли наблюдаться подобный эффект?
Старый 15.09.2008, 15:10   #10  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Orig.png из предыдущего сообщиния у меня отображается нормально
__________________
Axapta v.3.0 sp5 kr2
Старый 15.09.2008, 16:08   #11  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
В общем у меня есть 2 десятка jpg-файлов, которые неправильно отображаются, остальные нормально. Будем считать, что это неизвестный глюк
Старый 18.11.2008, 14:25   #12  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Решил использовать вместо функции 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);
 }
Если раскомментировать строку с StretchBlt, то нормально рисует, если вызывать AlphaBlend, то ничего не рисует и возвращает false

Похожий код на С прекрасно работает
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  
fedka is offline
fedka
Участник
 
69 / 15 (1) ++
Регистрация: 12.04.2007
Подниму тему, у меня также при использовании функции StretchBlt часть файлов формата jpg не отображается при выгрузке в Excel. Дополнительно при использовании функции StretchBlt не получается в Excel включить опцию прозрачности.

Функция AlphaBlend не срабатывает. Resize класса Image при изменении размера картинки дает ужасное качество конечного изображения.

Есть еще какие-нибудь варианты изменять изображение в Аксапте (для вставки в Excel)?
Старый 05.03.2015, 16:10   #14  
Kabardian is offline
Kabardian
Талантливый разгвоздяй
Аватар для Kabardian
 
424 / 338 (12) ++++++
Регистрация: 14.12.2008
Адрес: Москва
Записей в блоге: 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  
fedka is offline
fedka
Участник
 
69 / 15 (1) ++
Регистрация: 12.04.2007
Цитата:
Сообщение от Kabardian Посмотреть сообщение
Если речь про AX 2012 то советую присмотреться к классу EcoResProductImageManagement, он используется для отображения уменьшенных версий изображений в форме Используемые продукты" в режиме просмотра деталей продукта (Управление сведениями о продукте / Обычный / Используемые продукты, дважды кликнуть на номенклатуру, откроется форма), есть контрол ProductImage, в который загружается картинка прикрепленная к записи в форме через документооборот вот так:
X++:
//Источник: \Forms\EcoResProductDetailsExtended\Data Sources\InventTable\Methods\selectionChanged
productImageManagement = EcoResProductImageManagement::newFromCommon(inventTable);
    productImageManagement.loadProductImage(productImage);
Уменьшение изображения вроде корректно отрабатывает, возможно класс можно будет приспособить и под ваши нужды, если отвязать его от документооборота.

upd: тема-то стара как этот мир.. не буду стирать пост, хотя понимаю что он не актуален уже.
Спасибо, к сожалению не указал версию - используется 3.0
Старый 12.03.2015, 12:15   #16  
fedka is offline
fedka
Участник
 
69 / 15 (1) ++
Регистрация: 12.04.2007
Добрый день!
Пока остановились на том, что будут загружаться уже подготовленные картинки.

А занимался ли кто-нибудь обратной процедурой - загрузку картинок из Excel в Аксапту?
Axapta 3.0
Теги
image, jpg, resize, winapi, картинка

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Динамическое Изменение ExtendedDataType Jolly DAX: Программирование 2 06.08.2007 17:29
SalesQuickQuote - разрешить изменение фильтра в форме SHiSHok DAX: Программирование 6 26.06.2007 11:23
Изменение размера отчёта больше А4 Whity DAX: Программирование 8 12.12.2006 14:42
Как вызвать изменение Query в DS1 не вызывая метод executeQuery? Morpheus DAX: Программирование 5 17.10.2006 10:26
изменение значения DialogField Natasha DAX: Программирование 8 23.04.2004 11:02

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:29.