Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Преобразование картинки в строку (число прочтений - 17222 )
war_dendroid
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 1
Зарегистрирован: 07. Мая 2007
Преобразование картинки в строку
07. Мая 2007 :: 11:42
Печать  
Здравствуйте уважаемые участники.
Кто-нибудь сталкивался с преобразованием картинки в строку (неограниченной длины) и обратно для 1с версии 7.7 (сетевая или для sql). Интересует именно хранение картинки в базе как строки с преобразованием для отображения на форме. Если у кого-нибудь есть сведения или мысли по этой теме, откликнитесь пожалуйста.
Уважаю вас всех и каждого в отдельности.
Жду ответа. Денис.
  
Наверх
 
IP записан
 
desty
Full Member
***
Отсутствует



Сообщений: 135
Зарегистрирован: 19. Апреля 2007
Пол: Мужской
Re: Преобразование картинки в строку
Ответ #1 - 07. Мая 2007 :: 12:01
Печать  
раз - http://www.1cpp.ru/forum/YaBB.pl?num=1160657213/0#0 - здесь вроде что-то было для SQL

и

два - http://www.1cpp.ru/forum/YaBB.pl?num=1172744522/0#0 - а здесь четкий ответ про хранение в БД, без промежуточной записи

ИМХО дилинные строки лучше не использовать. представляю что будет с таблицей _1sconst

в любом случае необходимо смотреть в сторону BinaryData

« Последняя редакция: 07. Мая 2007 :: 17:46 - desty »  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Преобразование картинки в строку
Ответ #2 - 07. Мая 2007 :: 12:16
Печать  
desty писал(а) 07. Мая 2007 :: 12:01:
ИМХО дилинные строки лучше не использовать. представляю что будет с таблицей _1sconst
Длинные строки и таблица _1sconst никак не связаны.
Это в dbf длинные строки хранятся в 1sblob.dbf, а в sql хранятся "там где положено" в полях таблиц типа text.

(0)
Имхо, без преобразования двоичных данных в строку, например по алгоритму base64, не обойтись.
Могу предложить только работу через временный файл. Есть простенькая консольная утилита:
http://dev.citykirov.ru/dlcount.php?url=base64.zip
Цитата:
консольная утилита для base64 кодирования/декодирования файлов
Использование: base64 <команда> <файл_источник> <файл_приемник>
<команда>
 e - кодирование (encode) файла-источника в файл-приемник с кодировкой Base64
 d - декодирование (decode) из файл_источника с кодировкой Base64 в файл-приемник

А вот уже прекодированный временный файл закидывать в базу посредством BinaryData.
« Последняя редакция: 08. Мая 2007 :: 11:07 - trad »  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Преобразование картинки в строку
Ответ #3 - 08. Мая 2007 :: 11:07
Печать  
trad писал(а) 07. Мая 2007 :: 12:16:
А вот уже прекодированный временный файл закидывать в базу посредством BinaryData.

ошибся. BinaryData тут не поможет.
  

1&&2&&3
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Преобразование картинки в строку
Ответ #4 - 08. Мая 2007 :: 12:28
Печать  
Что за черт Улыбка А зачем хранить картинки текстом?
Надо создать в базе свою таблицу с полем image и хранить их там.
  
Наверх
ICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Преобразование картинки в строку
Ответ #5 - 08. Мая 2007 :: 16:10
Печать  
DmitrO писал(а) 08. Мая 2007 :: 12:28:
Что за черт Улыбка А зачем хранить картинки текстом?
Надо создать в базе свою таблицу с полем image и хранить их там.


А я бы спросил, а зачем хранить картинки вообще в SQL? скуль никогда не даст скорости доступа даже близкой к файловой системе.
Только база пухнуть будет.
Права на уровне ФС разруливаются прекрасно через WMI.
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Преобразование картинки в строку
Ответ #6 - 09. Мая 2007 :: 05:36
Печать  
Цитата:
А я бы спросил, а зачем хранить картинки вообще в SQL? скуль никогда не даст скорости доступа даже близкой к файловой системе.
Только база пухнуть будет.
Права на уровне ФС разруливаются прекрасно через WMI.

Имхо утверждение абсолютно безосновательно.

По скорости: я думаю что скорость будет не меньше, а может и больше. Скорость передачи данных с MSSQL достаточно высока. Данные идут в чистом виде по TCP, я не вижу где там могут быть потери на самом процессе передачи. Используется точно такой же сокет и транспортная библиотека. Работает тот же стек протокола. Механизм получения данных BLOB ни чем не отличается от обычной передачи массива данных через сеть.

По позиционированию: (по некоторому идентификатору надо найти в хранилище блок данных для передачи) не думаю что индексы MSSQL менее эффективны чем индексы файловой системы (по именам файлов). Я опять же склонен считать что они гораздо более эффективны. Хотябы по тому что индексное выражение описывается в БД гораздо строже, кроме того идентификатор можно сделать просто int, да пространство значений индекса ограничивается одной базой/таблицей, а в файловой системе это иерархическое дерево строк(!), да еще и по всему тому.

По оптимальности хранения: как не крути, а картинка это часть данных и должна храниться в базе данных, это ведь удобнее. По физически занимаемому месту в файловой системе можно получить выигрышь за счет более мелкого кластера, в MSSQL страница 8к и ни куда не денешься. Имхо это не существенно на самом деле, кто щас место считает Улыбка

С практической точки зрения: при работе через файловую систему будет работать служба доступа на sql-ном сервере, а у нее на таких серверах приоритет понижен, ее файловый кэш уменьшен, сервер сконфигурирован как сервер приложений, а не как файловый сервер. Однако при хранении картинок в БД при существующих на данных момент средствах 1cpp нам придется сначала стянуть ее на локальный диск во временный файл, а потом из него уже получить объект Картинка для отображения, а при хранении в файловой системе мы можем получить объект Картинка сразу с сервера. Формировать экземпляры объектов Картинка из данных рекордсета конечно же можно, но это не сделано, это было бы еще эффектинее.

Вообще говоря, надо провести тестирование, оно даст наиболее точные с практической точки зрения результаты. Улыбка
  
Наверх
ICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Преобразование картинки в строку
Ответ #7 - 09. Мая 2007 :: 16:47
Печать  
Все написанное верно. Но есть масса и других доводов. 1С вертится скорее всего на том же sql, а sql сервера всегда бывает мало. Зачем его нагружать не совсем свойственной ему задачей.
С другой стороны, если понадобится проверить часть файлов на разрешение, кол-во цветов, получить exif данные, то придется все эти файлы опять же сперва сохранить локально. Да много чего можно вспомнить...
В теории хранить можно, и даже где-то нужно, так как хранилище для всех данных будет в одном месте.
Но вот у меня больше 20000 жпегов, и занимают около 10 Гб. Только бэкап скуля будет занимать сколько времени...
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Преобразование картинки в строку
Ответ #8 - 09. Июня 2007 :: 04:53
Печать  
Храним в текстовом поле сертификаты( работает года 4)
Для этого был написан COM объект (Лежит на проклубе)
База 1с77 УРБД. Все остальные способы по хранению и передачи сертификатов оказались неудобными.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Преобразование картинки в строку
Ответ #9 - 09. Июня 2007 :: 06:27
Печать  
Z1 писал(а) 09. Июня 2007 :: 04:53:
Храним в текстовом поле сертификаты( работает года 4)
Для этого был написан COM объект (Лежит на проклубе)
База 1с77 УРБД. Все остальные способы по хранению и передачи сертификатов оказались неудобными.

а можешь ссылку показать?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Преобразование картинки в строку
Ответ #10 - 09. Июня 2007 :: 07:12
Печать  
JohnyDeath писал(а) 09. Июня 2007 :: 06:27:
[quote author=Z1

а можешь ссылку показать? [/quote]

http://1c.proclub.ru/modules/mydownloads/personal.php?cid=115&lid=3163
Последняя версия компоненты прикреплена
Описание и как ставить в архиве с проклуба
  

bfile_1c.zip ( 9 KB | Загрузки )
Наверх
 
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: Преобразование картинки в строку
Ответ #11 - 09. Июня 2007 :: 09:39
Печать  
JohnyDeath писал(а) 09. Июня 2007 :: 06:27:
Z1 писал(а) 09. Июня 2007 :: 04:53:
Храним в текстовом поле сертификаты( работает года 4)
Для этого был написан COM объект (Лежит на проклубе)
База 1с77 УРБД. Все остальные способы по хранению и передачи сертификатов оказались неудобными.

а можешь ссылку показать?

На самом деле задача преобразования бинарного файла в строку достаточно несложная.
Если занимаешься ВК, можешь сам быстро написать. У меня года два успешно работают два метода - ФайлВСтроку() и СтрокаВФайл(). Код могу подарить (но на VB6). А могу просто идею сказать, сам напишешь.
  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Преобразование картинки в строку
Ответ #12 - 09. Июня 2007 :: 10:25
Печать  
vip писал(а) 09. Июня 2007 :: 09:39:
JohnyDeath писал(а) 09. Июня 2007 :: 06:27:
Z1 писал(а) 09. Июня 2007 :: 04:53:
Храним в текстовом поле сертификаты( работает года 4)
Для этого был написан COM объект (Лежит на проклубе)
База 1с77 УРБД. Все остальные способы по хранению и передачи сертификатов оказались неудобными.

а можешь ссылку показать?

На самом деле задача преобразования бинарного файла в строку достаточно несложная.
Если занимаешься ВК, можешь сам быстро написать. У меня года два успешно работают два метода - ФайлВСтроку() и СтрокаВФайл(). Код могу подарить (но на VB6). А могу просто идею сказать, сам напишешь.

К сожелению ВК не занимаюсь. Печаль
Почитал про вариант Z1. Там надо запускать экзэшник, который должен постоянно пахать. ИМХО, как-то не очень красиво. И сразу задался вопросом: "а почему не сделали тоже самое, но в виде ВК?". Оказывается сделали.  Улыбка
не мог бы выложить?  Круглые глаза
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Преобразование картинки в строку
Ответ #13 - 09. Июня 2007 :: 10:54
Печать  
"Почитал про вариант Z1. Там надо запускать экзэшник, который должен постоянно пахать."
В exe храним внешний COM объект ( полная аналогия с dll). Exe файл не надо запускать всегда. Первый раз запускается только для саморегистрации объекта .
Далее при создании объекта в 1с Windows запускает объект,
при удалении объекта внутри 1с Windows уничтожает объект.
Я не настаиваю что мое решение единственно правильное.
в чем плюсы моего решения :
1. работает очень быстро ( написано на С++ и еще оптимизировал си-код)
2.при создании цель была чтобы бинарный файл как можно меньше занимал место внутри базы 1с ( из-за УРБД)
3. работает с 1с ( 1с не допускает в строковых реквизитах символ 0x00 ).
  
Наверх
 
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: Преобразование картинки в строку
Ответ #14 - 09. Июня 2007 :: 10:55
Печать  
Цитата:
Оказывается сделали.   
не мог бы выложить? 

К сожалению, нет. Пишу только для себя и поэтому внутри ВК полное безобразие. Это только кусочек многочисленных методов, которые никому, кроме меня не нужны. Тем более пишу на VB. Стыдно Улыбка А решениями поделиться могу.
  
Наверх
ICQ  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Преобразование картинки в строку
Ответ #15 - 09. Июня 2007 :: 22:27
Печать  
этта... что такое base64 и uuencode только я помню? прикольно Улыбка
  
Наверх
www  
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Преобразование картинки в строку
Ответ #16 - 10. Июня 2007 :: 04:52
Печать  
fez писал(а) 09. Июня 2007 :: 22:27:
этта... что такое base64 и uuencode только я помню? прикольно Улыбка

Отнюдь Улыбка
Однако и Z1 прав, Цитата:
чтобы бинарный файл как можно меньше занимал место внутри базы 1с
, что base64 и uuencode как-то не сильно...
  
Наверх
ICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Преобразование картинки в строку
Ответ #17 - 10. Июня 2007 :: 09:46
Печать  
Есть еще классная разработка г-на Барышникова http://1c.proclub.ru/modules/mydownloads/personal.php?cid=5&lid=3794

Цитата:
Непосредственному хранению двоичных данных в длинных строках 1С Предприятие 7.7 мешают
следующие обстоятельства:
1. 1С Предприятие "не признаёт" символ с кодом 0 в строках.
2. Большинство символов с кодами 1-32 в длинной строке при осуществлении операции
"Тестирование и исправление ИБ" будут восприняты как ошибка.
3. При сохранении длинной строки 1С Предприятие обрезает конечные пустые символы
(пробел, перевод строки и т.п.), что для двоичных данных недопустимо.
4. Размер длинной строки ограничен значением ~780Кб.

п.4 правда у меня вызывает сомнения; имхо не должно быть такого ограничения для SQL баз.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Преобразование картинки в строку
Ответ #18 - 13. Июня 2007 :: 04:21
Печать  
kms писал(а) 10. Июня 2007 :: 09:46:
Есть еще классная разработка г-на Барышникова http://1c.proclub.ru/modules/mydownloads/personal.php?cid=5&lid=3794

Цитата:
Непосредственному хранению двоичных данных в длинных строках 1С Предприятие 7.7 мешают
следующие обстоятельства:
1. 1С Предприятие "не признаёт" символ с кодом 0 в строках.
2. Большинство символов с кодами 1-32 в длинной строке при осуществлении операции
"Тестирование и исправление ИБ" будут восприняты как ошибка.
3. При сохранении длинной строки 1С Предприятие обрезает конечные пустые символы
(пробел, перевод строки и т.п.), что для двоичных данных недопустимо.
4. Размер длинной строки ограничен значением ~780Кб.

п.4 правда у меня вызывает сомнения; имхо не должно быть такого ограничения для SQL баз.


Про пункт 2 ничего сказать не могу. В своих базах не применяю.
По пункту 3 просто всегда добавляю к строке один символ ( 'z') при  чтении из файла
при записи игнорирую последний символ.
4. для dbf файлов макс размер = 80*100 000 байт ~ 8 Мб.
Есть вроде еще принипиальное ограничение на длину OLE строки или OLE строки для
1с но этой величины не достигал( у нас стоит ограничение на размер файла 400Kb).
  
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2344
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Преобразование картинки в строку
Ответ #19 - 12. Августа 2007 :: 21:26
Печать  
Z1 писал(а) 09. Июня 2007 :: 07:12:
JohnyDeath писал(а) 09. Июня 2007 :: 06:27:
а можешь ссылку показать?


http://1c.proclub.ru/modules/mydownloads/personal.php?cid=115&lid=3163
Последняя версия компоненты прикреплена
Описание и как ставить в архиве с проклуба

А сорцы есть?
ПС. Что-то мне подсказывает, что скоро потребуется мне такая вещь...
« Последняя редакция: 13. Августа 2007 :: 05:26 - trdm »  
Наверх
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Преобразование картинки в строку
Ответ #20 - 13. Августа 2007 :: 05:12
Печать  
trdm писал(а) 12. Августа 2007 :: 21:26:
А сорцы есть?
ПС. Что-то мне подсказывает, что скоро потребуется мне такая вещь...

А ты посмотри на соседнюю ветку. Там vip выкладывал конфу с активиксом для отображения картинок с помощью gflax.dll. Ссылка на библиотеку GFLAx также имеется.
  
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2344
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Преобразование картинки в строку
Ответ #21 - 13. Августа 2007 :: 05:28
Печать  
не, мне сама технология преобразования нужна, а не готовый объект.
  
Наверх
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Преобразование картинки в строку
Ответ #22 - 13. Августа 2007 :: 05:34
Печать  
Ну у vip'a спроси, думаю, что не откажет.
  
Наверх
 
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: Преобразование картинки в строку
Ответ #23 - 13. Августа 2007 :: 05:43
Печать  
JohnyDeath писал(а) 13. Августа 2007 :: 05:34:
Ну у vip'a спроси, думаю, что не откажет.

Там все просто.
1. Загоняешь файл картинки в байтовый массив.
2. Перебираешь байты и конвертируешь их в строку (это самый тупой метод, в С++ по моему есть отдельный класс для этого, но я на VB пишу).
Если соберусь с духом, попробую использовать ассемблерную вставку для этой операции.

А активикс я сделал именно для того, чтобы использовать метод GFLAx ReceiveBinary(), который позволяет отображать картинку прямо из байтового массива, без промежуточной записи файла на диск.

Байтовый массив для передачи в ReceiveBinary() формирую обратной конвертацией из строки, которая хранится в справочнике картинок.
Тоже нужно оптимизировать эту операцию.
  
Наверх
ICQ  
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2344
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Преобразование картинки в строку
Ответ #24 - 13. Августа 2007 :: 06:05
Печать  
vip писал(а) 13. Августа 2007 :: 05:43:
Там все просто.
1. Загоняешь файл картинки в байтовый массив.
2. Перебираешь байты и конвертируешь их в строку (это самый тупой метод, в С++ по моему есть отдельный класс для этого, но я на VB пишу).

0 >> 0x00, 1>>0x01 и т.п?
В принцыпе понятно.
  
Наверх
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: Преобразование картинки в строку
Ответ #25 - 13. Августа 2007 :: 06:16
Печать  
Цитата:
0 >> 0x00, 1>>0x01 и т.п?

Именно так Улыбка
Но это слегка неоптимально. В binfiles.dll такое преобразование выполняется в 10 раз быстрее. Так что тут поработать надо.
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Преобразование картинки в строку
Ответ #26 - 13. Августа 2007 :: 06:27
Печать  
trdm писал(а) 12. Августа 2007 :: 21:26:
Z1 писал(а) 09. Июня 2007 :: 07:12:
JohnyDeath писал(а) 09. Июня 2007 :: 06:27:
а можешь ссылку показать?


http://1c.proclub.ru/modules/mydownloads/personal.php?cid=115&lid=3163
Последняя версия компоненты прикреплена
Описание и как ставить в архиве с проклуба

А сорцы есть?
ПС. Что-то мне подсказывает, что скоро потребуется мне такая вещь...


пиши в личные сообщения с указанием куда слать ( только найти еще надо где это лежит )
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать