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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.08.2017, 12:07   #1  
TDV is offline
TDV
Участник
 
128 / 30 (2) +++
Регистрация: 04.11.2005
Image resize
Приветствую, как можно изменить через resize размер png. Есть файл в png на диске 12345.png, нужно его уменьшить на 60%. При сохранении остаются исходные размеры. Есть способы сделать resize именно в X++?
X++:
Image AxImage;
;
...
    CustInvoice4PaymId_RU='12345';
    ext='png';
    h=bitmap.get_Height(); // высота загружаемой png
    w=bitmap.get_Width();  // ширина загружаемой png
    AxImage = new Image();
    AxImage.createImage(w,h,8);
    AxImage.loadImage("Y:\\"+CustInvoice4PaymId_RU+"."+ext);
    w1=w*0.6;
     h1=h*0.6;
    AxImage.resize(w1,h1,0);
    AxImage.saveImage("Y:\\"+CustInvoice4PaymId_RU+"w9."+ext); // при сохранении остаются исходные w и h
Старый 01.08.2017, 12:56   #2  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
Цитата:
Сообщение от TDV Посмотреть сообщение
Приветствую, как можно изменить через resize размер png. Есть файл в png на диске 12345.png, нужно его уменьшить на 60%. При сохранении остаются исходные размеры. Есть способы сделать resize именно в X++?
У класса Image хоть он и наследник от BinData есть какие то глюки с загрузкой файла получением base64encode. Вот так работать будет
X++:
    binData = new BinData();
    binData.loadFile(@"d:\2.PNG");
    
    image = new Image();
    image.setData(binData.getData());
    image.resize(96,96,InterpolationMode::InterpolationModeHighQuality);
    image.saveImage(@"d:\2_1.png");
За это сообщение автора поблагодарили: TDV (1).
Старый 01.08.2017, 22:01   #3  
TDV is offline
TDV
Участник
 
128 / 30 (2) +++
Регистрация: 04.11.2005
Цитата:
Сообщение от maldini Посмотреть сообщение
У класса Image хоть он и наследник от BinData есть какие то глюки с загрузкой файла получением base64encode. Вот так работать будет
X++:
    binData = new BinData();
    binData.loadFile(@"d:\2.PNG");
    
    image = new Image();
    image.setData(binData.getData());
    image.resize(96,96,InterpolationMode::InterpolationModeHighQuality);
    image.saveImage(@"d:\2_1.png");
Спасибо, но это тоже не сработало, сохраняемый размер файла остался таким же.
X++:
AxImage = new Image();
     w=w*0.6;
     h=h*0.6;


      imgnew=System.Drawing.Image::FromFile(@"Y:\1\12345.png");
    h= imgnew.get_Height();
    w= imgnew.get_Width();
    h2=h*0.6;
    w2=w*0.6;
    bitmap = new System.Drawing.Bitmap(imgnew, w2,h2);

      sd =  System.Drawing.Graphics::FromImage(bitmap);
      bitmap.Save(@"Y:\1\12345.png");
Это сработало.

Еще вопрос, как можно задать(в X++) формат сжатия для JPG, с синтаксисом написания проблемы. В С# вроде все понятно, но на X++ не догоняю, как задать последний параметр encdp.
X++:
System.Drawing.Imaging.Encoder enc;
System.Drawing.Imaging.EncoderParameters[] encdpall;
System.Drawing.Imaging.EncoderParameters encdp;
System.Drawing.Imaging.EncoderParameter  encpv;
System.Drawing.Imaging.ImageCodecInfo imgci;
System.Drawing.Imaging.ImageCodecInfo[] imgciall;

..
imgciall= System.Drawing.Imaging.ImageCodecInfo::GetImageEncoders();
imgci=imgciall.GetValue(1);// JPG

enc= new System.Drawing.Imaging.Encoder(imgci.get_Clsid()); //?????
encpv= new System.Drawing.Imaging.EncoderParameter(enc,1);//?????
encpvall.SetValue(encpv,1);//?????
encdp.set_Param(encpvall);//?????

 bitmap.Save(@"Y:\1\12345.jpg",imgci,encdp);
как задать Quality для encdp ?
Старый 02.08.2017, 09:16   #4  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
Цитата:
Сообщение от TDV Посмотреть сообщение
Спасибо, но это тоже не сработало, сохраняемый размер файла остался таким же.
Странно, у меня в DAX 4 работает. Вы уверены что не работает, может не тот файл посмотрели?
Цитата:
как задать Quality для encdp ?
Тут я не подскажу, не работал с картинками в C#
Старый 02.08.2017, 11:17   #5  
TDV is offline
TDV
Участник
 
128 / 30 (2) +++
Регистрация: 04.11.2005
Цитата:
Сообщение от maldini Посмотреть сообщение
Странно, у меня в DAX 4 работает. Вы уверены что не работает, может не тот файл посмотрели?

Тут я не подскажу, не работал с картинками в C#
DAX 2009SP1, проверял, не сохраняет в измененном разрешении. Все равно спасибо за помощь.
Старый 02.08.2017, 15:10   #6  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
Цитата:
Сообщение от TDV Посмотреть сообщение
DAX 2009SP1, проверял, не сохраняет в измененном разрешении. Все равно спасибо за помощь.
Проверил на DAX 2009SP1. Тоже все работает

X++:
 binData binData;
    image   Image;
    ;
    
    binData = new BinData();
    binData.loadFile(@"C:\Users\Администратор\Documents\2.PNG");
    
    image = new Image();
    image.setData(binData.getData());
    image.resize(8,8,InterpolationMode::InterpolationModeHighQuality);
    image.saveImage(@"C:\Users\Администратор\Documents\2_1.png");
Миниатюры
Нажмите на изображение для увеличения
Название: Снимок.PNG
Просмотров: 515
Размер:	14.9 Кб
ID:	11580  
Старый 03.08.2017, 11:31   #7  
TDV is offline
TDV
Участник
 
128 / 30 (2) +++
Регистрация: 04.11.2005
Цитата:
Сообщение от maldini Посмотреть сообщение
Проверил на DAX 2009SP1. Тоже все работает

X++:
 binData binData;
    image   Image;
    ;
    
    binData = new BinData();
    binData.loadFile(@"C:\Users\Администратор\Documents\2.PNG");
    
    image = new Image();
    image.setData(binData.getData());
    image.resize(8,8,InterpolationMode::InterpolationModeHighQuality);
    image.saveImage(@"C:\Users\Администратор\Documents\2_1.png");
Да, на клиенте работает. В серверном классе, нет. Я выполнял в классе Run on Server, с добавлением perm = new InteropPermission(InteropKind::ClrInterop);, размер файла увеличивается(для JPG), для PNG остается такой же, разрешение тоже самое как в исходном файле.
Вообщем от этого варианта отказался, так как размер файла(для JPG) после resize увеличивается, что плохо, а копать сжатие нет желания. В Ghostscript через -r за менее чем секунду преобразовывает pdf в jpg(png) с мизерным размером, что устраивает. Спасибо еще раз!

Последний раз редактировалось TDV; 03.08.2017 в 11:45.
Старый 03.08.2017, 11:37   #8  
TDV is offline
TDV
Участник
 
128 / 30 (2) +++
Регистрация: 04.11.2005
На всякий случай то что в run on server классе, там где не меняет разрешение, но увеличивает размер файла(за счет не регулируемого сжатия для JPG). Для PNG и размер такой же остается и разрешение.

X++:
static void test12()
{
binData binData;
image   Image;
InteropPermission perm;
InteropPermission perm2;
Set               permissionSet;
    ;
    perm = new InteropPermission(InteropKind::ClrInterop);
    permissionSet =  new Set(Types::Class);

    permissionSet.add(new FileIoPermission(@"Y:\1\1.JPG",'rw'));
    permissionSet.add(new FileIoPermission(@"Y:\1\3.JPG",'rw'));
    CodeAccessPermission::assertMultiple(permissionSet);
    
    binData = new BinData();
    binData.loadFile(@"Y:\1\1.JPG");

    image = new Image();
    image.setData(binData.getData());
    image.resize(8,8,InterpolationMode::InterpolationModeHighQuality);
    image.saveImage(@"Y:\1\3.JPG");
    CodeAccessPermission::revertAssert();
}

Последний раз редактировалось TDV; 03.08.2017 в 11:41. Причина: добавил: там где не меняет разрешение, но увеличивает рзамер
Старый 03.08.2017, 14:12   #9  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
Цитата:
Сообщение от TDV Посмотреть сообщение
На всякий случай то что в run on server классе, там где не меняет разрешение, но увеличивает размер файла(за счет не регулируемого сжатия для JPG). Для PNG и размер такой же остается и разрешение.
X++:
static void test12(Args _args)
{
    binData binData;
    image   Image;
    InteropPermission perm;
    InteropPermission perm2;
    Set               permissionSet;
    ;

    perm = new InteropPermission(InteropKind::ClrInterop);
    permissionSet =  new Set(Types::Class);

    permissionSet.add(new FileIoPermission(@"Y:\1\1.JPG",'rw'));
    permissionSet.add(new FileIoPermission(@"Y:\1\3.JPG",'rw'));
    CodeAccessPermission::assertMultiple(permissionSet);

    binData = new BinData();
    binData.loadFile(@"Y:\1\1.JPG");

    image = new Image();
    image.setData(binData.getData());
    image.resize(64,64,InterpolationMode::InterpolationModeHighQuality);
 
    binData = new BinData();
    binData.setData(image.getData());
    binData.saveFile(@"Y:\1\3.JPG");
 
    CodeAccessPermission::revertAssert();
}
Вот так попробуй.
Старый 03.08.2017, 17:32   #10  
TDV is offline
TDV
Участник
 
128 / 30 (2) +++
Регистрация: 04.11.2005
Цитата:
Сообщение от maldini Посмотреть сообщение
X++:
static void test12(Args _args)
{
    binData binData;
    image   Image;
    InteropPermission perm;
    InteropPermission perm2;
    Set               permissionSet;
    ;

    perm = new InteropPermission(InteropKind::ClrInterop);
    permissionSet =  new Set(Types::Class);

    permissionSet.add(new FileIoPermission(@"Y:\1\1.JPG",'rw'));
    permissionSet.add(new FileIoPermission(@"Y:\1\3.JPG",'rw'));
    CodeAccessPermission::assertMultiple(permissionSet);

    binData = new BinData();
    binData.loadFile(@"Y:\1\1.JPG");

    image = new Image();
    image.setData(binData.getData());
    image.resize(64,64,InterpolationMode::InterpolationModeHighQuality);
 
    binData = new BinData();
    binData.setData(image.getData());
    binData.saveFile(@"Y:\1\3.JPG");
 
    CodeAccessPermission::revertAssert();
}
Вот так попробуй.
Тоже самое(на сервере), не меняет, в 3 сохраняет разрешение из 1. Ради спортивного интереса , хотелось понять в чем проблема, но да ладно. Другим способом решилось.
Старый 04.08.2017, 10:18   #11  
Player1 is offline
Player1
Участник
Самостоятельные клиенты AX
 
306 / 137 (5) +++++
Регистрация: 21.04.2008
Изменение размера картинки
За это сообщение автора поблагодарили: TDV (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: Dynamics AX R3 CU9 Demo Image: a different "The price cannot be calculated for the item” error in EPOS Blog bot DAX Blogs 0 14.08.2015 02:22
axblog4u: Display Web Image Content in Forms using Dynamics AX2012 Blog bot DAX Blogs 0 28.05.2012 19:12
lcash: Using document handling to add image in Demo VM Blog bot DAX Blogs 0 21.07.2009 10:05
axaptapedia: Image class Blog bot DAX Blogs 0 22.07.2008 15:05
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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