Имя: Пароль:
1C
 
Как определить размер картинки jpg из 1С?
0 Начинающий админ
 
16.05.06
15:59
Как определить размер картинки в пикселях jpg из 1С (программно)?
Предполагаю, что нужну идти путем:
Объект = СоздатьОбъект("Scripting.FileSystemObject");
Картинка = Объект.OpenTextFile(ПутьККартинке);

Далее можно через КодСимв(Картинка.Read(1)) получать данные из файла в байтах.

А вот где именно в jpg хранятся его размеры?

PS или может есть другой путь?
1 Транзистор
 
16.05.06
16:03
(0)Если идти этим путем, то вот ответ на твой вопрос. Перебирая ищешь вот эти строчки. Параметр PixelXDimension количество точек по горизонтали, а PixelYDimension по вертикали.
<rdf:Description rdf:about='uuid:df87e056-c48a-11da-bf10-eb157805050c'
 xmlns:exif='http://ns.adobe.com/exif/1.0/'>;
 <exif:ExifVersion>0220</exif:ExifVersion>
 <exif:ColorSpace>4294967295</exif:ColorSpace>
 <exif:PixelXDimension>1920</exif:PixelXDimension>
 <exif:PixelYDimension>1200</exif:PixelYDimension>
</rdf:Description>
2 romix
 
модератор
16.05.06
16:08
Я делал через ВК. Могу выложить...
3 evGenius
 
16.05.06
16:10
(1) Это частный случай, не всегда так.
4 evGenius
 
16.05.06
16:10
ИМХО можно только через ВК.
5 Начинающий админ
 
16.05.06
16:19
(1) Увы, не понял :( Не могу никак увидеть PixelXDimension в своих картинках (смотрю f3 в ТоталКоммандере).
(2) Если не сложно... Буду благодарен. Например сюда: anatoly_obninsk [at] mail.ru
(4) Я вот думаю, неужели нет каких-нибудь байтов в начале картинки, которые бы гаранитрованно определяли размер?
6 evGenius
 
16.05.06
16:28
(5) Нет таких байтов.
7 Начинающий админ
 
16.05.06
16:34
Нашел в сети вот что:

Dim imagefile,fso,image,width,height,buffer,length
imagefile="image.jpg"
Set fso = CreateObject("Scripting.FileSystemObject")
Set image = fso.OpenTextFile(Server.MapPath(imagefile))
image.Skip(2)
Do
Do
buffer = image.Read(1)
If asc(buffer) <> 255 Then Exit Do
Loop
If asc(buffer) < 192 Or 195 < asc(buffer) Then
buffer = image.Read(2)
length = CLng(asc(mid(buffer,1,1))) * 256 + asc(mid(buffer,2,1))
image.Skip(length - 2)
Else
Exit Do
End If
Loop
buffer = image.Read(7)
width = asc(mid(buffer,6,1))*256 + asc(mid(buffer,7,1))
height = asc(mid(buffer,4,1))*256 + asc(mid(buffer,5,1))
Response.Write("width = " & width & ", height = " & height)
image.Close
Set image = Nothing
Set fso = Nothing


Переделал под 1С (но сто % не верно, т.к. не раскусил что такое Loop :)

   fso = СоздатьОбъект("Scripting.FileSystemObject");
   image = fso.OpenTextFile(лПуть);
   image.Skip(2);
   
   Пока 1=1 Цикл
       Пока 1=1 Цикл
           buffer = image.Read(1);
           Если КодСимв(buffer) <> 255 Тогда
               Прервать;                    
           КонецЕсли;
           
           Если (КодСимв(buffer) < 192) Или (195 < КодСимв(buffer)) Тогда
               buffer = image.Read(2);
               length = СтрДлина(КодСимв(mid(buffer,1,1))) * 256 + КодСимв(mid(buffer,2,1));
               image.Skip(length - 2);
           Иначе
               Прервать;
           КонецЕсли;
           
           buffer = image.Read(7);
           width = КодСимв(mid(buffer,6,1))*256 + КодСимв(mid(buffer,7,1));
           height = КодСимв(mid(buffer,4,1))*256 + КодСимв(mid(buffer,5,1));
           Сообщить("Ширина = " + width + ", Высота = " + height);
       КонецЦикла;
   КонецЦикла;
8 romix
 
модератор
16.05.06
16:34
Выкладываю ВК: http://x-romix.narod.ru/avk.rar
(качать ЛЕВОЙ кнопкой мыши, ~143К)
9 Транзистор
 
16.05.06
16:35
Оперативно работаете.
10 airyashov
 
16.05.06
16:36
Do
Loop
цикл VB
11 Начинающий админ
 
16.05.06
16:41
(8) Спасибо. Буду разбираться.
(10) А в терминах 1С это что? :)
12 romix
 
модератор
16.05.06
16:46
(+8) Если че, там исходник приложен на Дельфи.
(11-2)
Пока 1=1 Цикл
КонецЦикла
13 smaharbA
 
16.05.06
16:52
Кашмар!
14 Начинающий админ
 
16.05.06
16:55
(12) Ну я так и понял. см: (7)
(13) Уважаемый, smaharbA подскажи вечно начинающему как можно реализовать сабж наиболее быстрым и простым способом? :)
15 smaharbA
 
16.05.06
16:57
//*******************************************
Процедура Сформировать()
   Имя="";
   Каталог="";
   Если ФС.ВыбратьФайлКартинки(0,Имя,Каталог)=1 Тогда
       fso=createobject("scripting.filesystemobject");
       Shell = CreateObject("Shell.Application");
       Folder = Shell.Namespace(Каталог);
       Сообщить(Folder.GetDetailsOf(Folder.Items().item(Имя), 26));
   КонецЕсли;
КонецПроцедуры
16 Начинающий админ
 
16.05.06
17:03
(15) вроде пустую строку возвращает :(
PS убегаю, завтра буду доразбираться...
17 smaharbA
 
16.05.06
17:05
Сообщить(Folder.GetDetailsOf(Folder.Items().item(Имя), 26));
Сообщить(Folder.GetDetailsOf(Folder.Items().item(Имя), 27));
Сообщить(Folder.GetDetailsOf(Folder.Items().item(Имя), 28));
18 Директор PR отдела
 
16.05.06
17:07
КАк всегда пришёл Звездатый Эксперт Олежка и всех заляпал.
19 Новичок541289
 
16.05.06
17:08
По моему этого никак не сделать!
20 smaharbA
 
16.05.06
17:22
(19) Да ну ?
21 Хванчкара
 
16.05.06
17:23
(15) Все работает
22 Хванчкара
 
16.05.06
17:25
(20) гденить лежит chm по классам scripting.... и т.п. чтоб почитать
23 mrkorn
 
16.05.06
17:30
(22)не знаю. мож пойдет
http://www.script-coding.info/
24 smaharbA
 
16.05.06
17:32
25 smaharbA
 
16.05.06
17:32
(23) Да там много интересного материала есть
26 Хванчкара
 
16.05.06
17:36
Спасибо
27 Vippi
 
16.05.06
23:44
(15) Преклоняюсь. Молодец.
А я, дурак, в свое время ВК слепил на эту тему.
28 insider
 
16.05.06
23:50
имхо в БЗ
и вообще пора собрание сочинений smaharbA вынести в отдельный том :)
29 Vippi
 
16.05.06
23:55
(28) Точно.
И назначить технического писателя для упорядочивания мыслей ;)
Выпивающий меньше живет, но больше видит. Олег, прости, это и про меня можно сказать :))
30 insider
 
16.05.06
23:57
(29) все мы там будем :) если б еще кол-во выпитого было пропорционально таланту, точнее талант выпитому... но увы :)
31 romix
 
модератор
17.05.06
01:18
(27) Не ты один. :-)
Добавлено в БЗ.
32 Начинающий админ
 
17.05.06
08:22
(17) Для 26,27... выводит пустую строку, есть данные только для:

1: 1 473 КБ
2: Рисунок JPEG
3: 16.05.2006 7:20
4: A
5:
6: 17.05.2006 8:02
7: 17.05.2006 8:03
8: Администраторы
далее пустые строки :(

Подскажи, где копать? С чем может быть связано?

PS речь о win2000 sp4 в citrix, локально на xp все нормально (права администратора всюду)
33 skunk
 
17.05.06
08:25
34 Начинающий админ
 
17.05.06
08:44
(33) Круто!
однако размер картинки так и не определяет :(, пишет:
"Размер картинки неизвестен..."
35 skunk
 
17.05.06
08:46
у тебя ХР без паков?
36 Начинающий админ
 
17.05.06
08:47
(35) xp sp2, там все ОК, не определяет на win2000 sp4 :(
37 skunk
 
17.05.06
08:48
(36)на 2000 не смотрел... думаю тебе надо whs патчить
38 skunk
 
17.05.06
08:51
39 Начинающий админ
 
17.05.06
08:52
(37) А это как? :)
40 Начинающий админ
 
17.05.06
08:53
(38) спасибо
41 skunk
 
17.05.06
08:57
не за что

а вот тоже самое... только по китайский

http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=c717d943-7e4b-4622-86eb-95a22b832caa
42 smaharbA
 
17.05.06
09:17
//*******************************************
Процедура Сформировать()
   Имя="";
   Каталог="";
   Если ФС.ВыбратьФайлКартинки(0,Имя,Каталог)=1 Тогда
       ИЕ=СоздатьОбъект("InternetExplorer.Application");
       ИЕ.Navigate("about:blank");
       Док=ИЕ.document;
       Док.body.innerHTML="<img id=img src=file://"+Каталог+Имя+">";
       Сообщить(Док.getElementById("img").offsetHeight);
       Сообщить(Док.getElementById("img").offsetWidth);
   КонецЕсли;
КонецПроцедуры
43 smaharbA
 
17.05.06
09:50
//*******************************************
Процедура Сформировать()
   Имя="";
   Каталог="";
   Если ФС.ВыбратьФайлКартинки(0,Имя,Каталог)=1 Тогда
       ИЕ=СоздатьОбъект("InternetExplorer.Application");
       ИЕ.Fullscreen=-1;
       ИЕ.Navigate(Каталог+Имя);
       IMG=ИЕ.document.getElementsByTagName("IMG").item(0);
       Сообщить(IMG.Height);
       Сообщить(IMG.Width);
   КонецЕсли;
КонецПроцедуры
44 skunk
 
17.05.06
09:51
(42)загрузи картинку больше чем ИЕ
45 smaharbA
 
17.05.06
09:52
(44) Это если автоподгон, но если стиль поставить на IMG то пофих
46 smaharbA
 
17.05.06
09:54
+(45) кстати в варианте (42) безразницы
47 skunk
 
17.05.06
09:54
(45)это ты знаешь... по дефолту он стоит в автоподгон... так что по дефолту надо либо отключать его программно... либо
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший