helpf.pro
Регистрация

v7: Преобразование изображения в base64, в картинку на диске

denshu66
25.04.2018 16:11Прочитано: 5978

Добрый день. Есть у нас строка вида data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKC и т.д.

Если мы такую строчку вставляем в браузер, то браузер показывает картинку. Скажите может ли 1с 7.7 переформатировать такую строку в картинку и сохранить на жесткий диск?

Yandex
Возможно, вас также заинтересует
Реклама на портале
АВП
26.04.2018 00:35Ответ № 1

Конкретно на вопрос не отвечу, не знаю. Но что мешает сохранить картинку из браузера с нужным расширением и уже ее загрузить в 1С?

all4cf
26.04.2018 01:53Ответ № 2

Вам нужно декодировать строку и сохранить то что получилось в файл

Для 1С 7.7 функция декодирования base64 и кодирования

Код 1C v 7.x
 //******************************************************************************
// ДекодироватьBase64(Текст64)
//
Функция ДекодироватьBase64(Текст64)
    Перем Алфавит;
    Перем Группа, Символ;
    Перем Значение, Разряд;
    Перем Символ6, Значение6;
    Перем Значение8, Символ8;
    Перем Текст;
    
    // Подготовка алфавита и результата
    Алфавит = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    Текст = "";
    
    // Получение групп по 4 значащих символа
    Группа = "";
    Для Номер = 1 По СтрДлина(Текст64) Цикл
        Символ = Сред(Текст64, Номер, 1);
        Если Найти(Алфавит, Символ) = 0 Тогда
            Продолжить;
        КонецЕсли;
        Группа = Группа + Символ;
        Если СтрДлина(Группа) = 4 Тогда


            // Получение числового значения из 4-х символов
            Значение = 0;
            Разряд = 3;
            Пока Разряд >= 0 Цикл
                Символ6 = Сред(Группа, 4 - Разряд, 1);
                Если Символ6 = "=" Тогда
                    Значение6 = 0;
                Иначе
                    Значение6 = Найти(Алфавит, Символ6) - 1;
                КонецЕсли;
                Если Разряд = 1 Тогда
                    Значение6 = Значение6 * 64;
                ИначеЕсли Разряд = 2 Тогда
                    Значение6 = Значение6 * 64 * 64;
                ИначеЕсли Разряд = 3 Тогда
                    Значение6 = Значение6 * 64 * 64 * 64;
                КонецЕсли;
                Значение = Значение + Значение6;
                Разряд = Разряд - 1;
            КонецЦикла;


            // Получение 3-х символов из числового значения            
            Разряд = 2;
            Пока Разряд >= 0 Цикл
                Значение8 = Значение;
                Если Разряд = 2 Тогда
                    Значение8 = Цел(Значение8 / 256 / 256);
                    Значение = Значение - Значение8 * 256 * 256;
                ИначеЕсли Разряд = 1 Тогда
                    Значение8 = Цел(Значение8 / 256);
                    Значение = Значение - Значение8 * 256;
                КонецЕсли;
                
                Если Значение8 <>  0 Тогда // [+] Decker
                    // чтобы не добавлялись лишние символы пробела
                    Символ8 = Симв(Значение8);
                    Текст = Текст + Символ8;
                КонецЕсли;
                
                Разряд = Разряд - 1;
            КонецЦикла;
            
            Группа = "";
        КонецЕсли;
    КонецЦикла;
    
    Возврат Текст;
    
КонецФункции // ДекодироватьBase64()


//*******************************************




Функция КодироватьBase64(Текст) // (с) Decker
    Перем Алфавит;
    Перем Группа, Символ;
    Перем Значение, Разряд;
    Перем Символ6, Значение6;
    Перем Значение8, Символ8;
    Перем Текст64;
    
    // Подготовка алфавита и результата
    Алфавит = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    Текст64 = ""; 
           
    Группа = "";
    Для Номер=1 По СтрДлина(Текст) Цикл
    
    Символ = Сред(Текст, Номер, 1);
    Группа = Группа + Символ;
    
    Если ((СтрДлина(Группа) = 3) или (Номер = СтрДлина(Текст))) Тогда
        
        // Получение числового значения из 3-х символов
            Значение = 0;
            Разряд = 2;
            Пока Разряд >= 0 Цикл
                Символ8 = Сред(Группа, 3 - Разряд, 1);
                Значение8 = КодСимв(Символ8);
                Если Разряд = 1 Тогда
                    Значение8 = Значение8 * 256;
                ИначеЕсли Разряд = 2 Тогда
                    Значение8 = Значение8 * 256 * 256;
                КонецЕсли;
                Значение = Значение + Значение8;
                Разряд = Разряд - 1;
            КонецЦикла;
            
        // Получение 4-х символов из числового значения    
            Разряд = 3;
            Пока Разряд >= 0 Цикл
                Значение6 = Значение;
                Если Разряд = 3 Тогда
                    Значение6 = Цел(Значение6 / 64 / 64 / 64);
                    Значение = Значение - Значение6 * 64 * 64 * 64;
                ИначеЕсли Разряд = 2 Тогда
                    Значение6 = Цел(Значение6 / 64 / 64);
                    Значение = Значение - Значение6 * 64 * 64;
                ИначеЕсли Разряд = 1 Тогда
                    Значение6 = Цел(Значение6 / 64);
                    Значение = Значение - Значение6 * 64;
                КонецЕсли;      
                
                Если СтрДлина(Группа) < 3 Тогда
                    Если Значение6 = 0 Тогда
                        Значение6 = 64;
                    КонецЕсли;
                КонецЕсли;


                Символ6 = Сред(Алфавит, Значение6+1,1);
                Текст64 = Текст64 + Символ6;
                Разряд = Разряд - 1;
            КонецЦикла;    
                        
        Группа = "";    
        КонецЕсли;
    КонецЦикла;   
    
    Возврат Текст64;
    
КонецФункции // КодироватьBase64()

Еще один способ для 7.7

Код 1C v 7.x
 Функция Кодировать(Стр, Кодировка)
    ЦДО=СоздатьОбъект("CDO.Message");
    БодиПарт=ЦДО.BodyPart;
    Поля=БодиПарт.Fields;
    Поле=Поля.Item("urn:schemas:mailheader:content-type");
    Поле.Value="text/plain; charset=""windows-1251""";
    Поля.Update();
    Стрим = БодиПарт.GetDecodedContentStream();
    Стрим.charset = "windows-1251";
    Стрим.WriteText(Стр);
    Стрим.Flush();
    БодиПарт.ContentTransferEncoding = Кодировка;
    Стрим=БодиПарт.GetEncodedContentStream();
    Возврат Стрим.ReadText();
КонецФункции    // Кодировать64(Стр)




Функция Декодировать(Стр, Кодировка)
    ЦДО=СоздатьОбъект("CDO.Message");
    БодиПарт=ЦДО.BodyPart;
    БодиПарт.ContentTransferEncoding = Кодировка;
    Стрим=БодиПарт.GetEncodedContentStream();
    Поля=БодиПарт.Fields;
    Поле=Поля.Item("urn:schemas:mailheader:content-type");
    Поле.Value="text/plain; charset=""windows-1251""";
    Поля.Update();
    Стрим.WriteText(Стр);
    Стрим.Flush();
    Стрим = БодиПарт.GetDecodedContentStream();
    Стрим.charset = "windows-1251";
    Возврат Стрим.ReadText();
КонецФункции    // Декодировать64(Стр)


//*******************************************


Процедура Сформировать()
    Кодировка = "base64";
    Стр=Кодировать("Вася Пупкин",Кодировка);
    Сообщить(Стр);
    Сообщить(Декодировать(Стр,Кодировка));


    Кодировка = "quoted-printable";
    Стр=Кодировать("Вася Пупкин",Кодировка);
    Сообщить(Стр);
    Сообщить(Декодировать(Стр,Кодировка));
КонецПроцедуры

а вот с 8.х все лучше:

Код 1C v 8.х
 &НаКлиенте
Процедура Decode(Команда)
    
    ДвДанные = Base64Значение(Encoded);
    Если ДвДанные = Неопределено Тогда
        Предупреждение("Ошибка формата Base64");
        Возврат;
    КонецЕсли;
    ВременныйФайл = ПолучитьИмяВременногоФайла();
    ДвДанные.Записать(ВременныйФайл);
    
    КодировкаФайла = Кодировка;
    
    Если Кодировка = "ANSI" Тогда
        КодировкаФайла = КодировкаТекста.ANSI;
        
    ИначеЕсли Кодировка = "OEM" Тогда
        КодировкаФайла = КодировкаТекста.OEM;
        
    ИначеЕсли Кодировка = "UTF8" Тогда
        КодировкаФайла = КодировкаТекста.UTF8;
        
    ИначеЕсли Кодировка = "UTF16" Тогда
        КодировкаФайла = КодировкаТекста.UTF16;
        
    ИначеЕсли Кодировка = "Системная" Тогда
        КодировкаФайла = КодировкаТекста.Системная;
    
    КонецЕсли;
    Чтение = Новый ЧтениеТекста(ВременныйФайл, КодировкаФайла);
    Decoded = Чтение.Прочитать();
    Чтение.Закрыть();
    УдалитьФайлы(ВременныйФайл);
    
КонецПроцедуры


&НаКлиенте
Процедура Encode(Команда)
    
    КодировкаФайла = Кодировка;
    
    Если Кодировка = "ANSI" Тогда
        КодировкаФайла = КодировкаТекста.ANSI;
        
    ИначеЕсли Кодировка = "OEM" Тогда
        КодировкаФайла = КодировкаТекста.OEM;
        
    ИначеЕсли Кодировка = "UTF8" Тогда
        КодировкаФайла = КодировкаТекста.UTF8;
        
    ИначеЕсли Кодировка = "UTF16" Тогда
        КодировкаФайла = КодировкаТекста.UTF16;
        
    ИначеЕсли Кодировка = "Системная" Тогда
        КодировкаФайла = КодировкаТекста.Системная;
    
    КонецЕсли;
    ВременныйФайл = ПолучитьИмяВременногоФайла();
    
    Запись = Новый ЗаписьТекста(ВременныйФайл, КодировкаФайла);
    Запись.Записать(Decoded);
    Запись.Закрыть();
    
    ДвДанные = Новый ДвоичныеДанные(ВременныйФайл);
    Encoded = Base64Строка(ДвДанные);
    
    УдалитьФайлы(ВременныйФайл);
    
КонецПроцедуры
denshu66
26.04.2018 08:53Ответ № 3

Не совсем понимаю каким образом полученную декодированную строку сохранить в файл так что бы получилась картинка...

all4cf
27.04.2018 11:53Ответ № 4

Новый ДвоичныеДанные

Подсказка: Для быстрого поиска ответов - используйте 'Поиск'
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.