Показать полную графическую версию : [решено] Подсчет размера DHT секции JPEG файла
Доброй ночи!
Помогите, пожалуйста, в написании VBS скрипта подсчитывающего колиество байт DHT секции (Таблицы Хаффмана) JPEG файла.
т.е. необходимо в стуктуре JPEG файла найти тэг "FF C4" и посчитать количество байт до следующей секции (обычно SOS "Начало Сканирования" = "FF DA").
Дополнительно прошу сделать условие, что если размер секции не превышает 200 байт выводить скажем параметр "А", а если превышает 300 - тогда "В". Значения находящиеся в промежутке меня пока не интересуют.
Пы.Сы. Как и в прошлый раз (http://forum.oszone.net/post-1810917.html) это необходимо для подключения скрипта к Тотал Коммандеру и ввода значений в колонки для сортировки.
El Sanchez
03-05-2012, 18:36
pzh2393,
Path = "c:\temp\Chicken.JPG"
Set BinaryStream = CreateObject("ADODB.Stream")
BinaryStream.Type = 1
BinaryStream.Open
BinaryStream.LoadFromFile Path
BinaryFile = BinaryStream.Read
For i = 1 To LenB(BinaryFile)
If AscB(MidB(BinaryFile, i, 1)) < 16 Then S = S & "0" & Hex(AscB(MidB(BinaryFile, i, 1))) Else S = S & Hex(AscB(MidB(BinaryFile, i, 1)))
Next
DHT = (InStr(S, "FFDA")-InStr(S, "FFC4"))/2-2
If DHT <= 200 Then WScript.Echo "A"
If DHT >= 300 Then WScript.Echo "B"
BinaryStream.Close
Спасибо! буду пробовать прикрутить к чему мне необходимо..
El Sanchez, я пробовал данный подход, и даже не стал выкладывать, поскольку не годится, ибо дико медленно. pzh2393, для данного случая Вам WSH не подойдёт — ну, нет у него вменяемых средств для подобной работы. Лучше попросите о том же в соседней ветке: Программирование (http://forum.oszone.net/forum-21.html), если Вам подойдёт исполняемый файл.
El Sanchez
04-05-2012, 21:55
поскольку не годится, ибо дико медленно »
Iska, да уж, тормоз еще тот. Каюсь, тестировал на файле маленького размера.
pzh2393, предлагаю вариант №2, побыстрее:
sPath = "c:\temp\e.jpg"
nChunkSize = 1024
Set BinaryStream = CreateObject("ADODB.Stream")
BinaryStream.Type = 1
BinaryStream.Open
BinaryStream.LoadFromFile sPath
Do While InStr(sRes, "FFDA") = 0
BinaryFile = Empty
BinaryFile = BinaryStream.Read(nChunkSize)
For i = 1 To nChunkSize
sRes = sRes & Right("00" & Hex(AscB(MidB(BinaryFile, i, 1))), 2)
Next
If InStr(sRes, "FFDA") > 0 Then
sHuffSection = Mid(sRes, InStr(sRes, "FFC4"), InStr(sRes, "FFDA")-InStr(sRes, "FFC4"))
Do While InStr(sHuffSection, "FFC4") > 0
nDHTsz = nDHTsz + CInt("&H" & Mid(sHuffSection, 5, 4))
sHuffSection = Right(sHuffSection, Len(sHuffSection)-CInt("&H" & Mid(sHuffSection, 5, 4))*2-4)
Loop
End If
Loop
If nDHTsz <= 200 Then WScript.Echo "A"
If nDHTsz >= 300 Then WScript.Echo "B"
BinaryStream.Close
Может всетаки получится, если упростим условие?
Выяснилось, что следующие два байта после тэга "FF C4" указывают на размер секции DHT в 16-ричном виде...
Можно сделать поиск НЕХ значения "FF C4" перевод следующих за этим двух байт в 10-ричное значение и в зависимости от размера выдача результата?
2 El Sanchez Премного благодарен!
Видимо писал предыдущее сообщение в одно время с вами...
Сейчас проверил - срабатывает именно так, как необходимо!
Выяснилось, что следующие два байта после тэга "FF C4" указывают на размер секции DHT в 16-ричном виде... »
Просите коллегу El Sanchez'а, чтобы сделал; будет отрабатывать ещё шустрее.
El Sanchez
05-05-2012, 11:35
Выяснилось, что следующие два байта после тэга "FF C4" указывают на размер секции DHT в 16-ричном виде...
Можно сделать поиск НЕХ значения "FF C4" перевод следующих за этим двух байт в 10-ричное значение и в зависимости от размера выдача результата? »
pzh2393, так оно и реализовано. Из объектной переменной BinaryStream, содержащей весь файл, в переменную BinaryFile считывается порция данных размером nChunkSize и переводится в промежуточный строковый буфер sRes до тех пор, пока sRes не будет содержать в себе маркер SOS (FFDA). Из буфера вычленяется секция DHT (разница между вхождением в sRes значения FFDA и первого вхождения маркера DHT (FFCA)) и присваивается переменной sHuffSection. Далее работа идет с этой переменной. В цикле ищутся все вхождения FFCA (таблиц может быть несколько), берутся 4 символа (2 байта) после маркера, переводятся в число, результат добавляется к nDHTsz - общему числу байт, переменная sHuffSection уменьшается на длину маркера и длину данных и далее обрабатывается в цикле, пока есть вхождения FFCA.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.