Гость
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / как считать разрешение картинки / 18 сообщений из 18, страница 1 из 1
28.02.2011, 20:32
    #37140405
Лампочка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как считать разрешение картинки
всем доброго времени суток! я считываю картинку в blob. Как из этого blob-а получить разрешение картинки?(по горизонтали и по вертикали)
...
Рейтинг: 0 / 0
28.02.2011, 21:02
    #37140444
Лампочка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как считать разрешение картинки
на самом деле я знаю алгоритм считывания, но я не могу перевести его с делфи на билдер...
в делфи используется filestream(если не ошибаюсь), функции SWAP и ORD, применяемые к считанным из filestream данным типа word. В общем, я в таком расстройстве, что даже не могу толком объяснить..может быть, кто-то знает, как на билдере считывать разрешение?
...
Рейтинг: 0 / 0
28.02.2011, 21:23
    #37140467
Ikar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как считать разрешение картинки
Лампочка,

Однажды мне пришлось делать тоже самое, но я тогда обошелся грубым методом тыка: на окне создавал объект picture с настиройками, чтобы объект под картинку растягивался, запихивал картинку в него, считывал размеры в PBUnit'ах и пересмчитывал их в пиксели. Оно, конечно, криво и в корне не правильно, но работает :)
...
Рейтинг: 0 / 0
28.02.2011, 21:25
    #37140469
Лампочка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как считать разрешение картинки
Спасибо,Икар! мне программер, который задачу ставит, не простит этого. А вот и код на Делфи. Но убейте меня - я не могу перевести его на билдер...
procedure GetResJpg(JPGFile: string);
const
BufferSize = 50;
var
Buffer: string;
Index: integer;
FileStream: TFileStream;
HorzRes, VertRes: Word;
DP: Byte;
Measure: string;
begin
FileStream := TFileStream.Create(JPGFile,
fmOpenReadWrite);
try
SetLength(Buffer, BufferSize);
FileStream.Read(buffer[1], BufferSize);
Index := Pos('JFIF' + #0$00,buffer);
if Index > 0 then
begin
FileStream.Seek(Index + 6, soFromBeginning);
FileStream.Read(DP, 1);
case DP of
1: Measure := 'DPI'; //Dots Per Inch
2: Measure := 'DPC'; //Dots Per Cm.
end;
FileStream.Read(HorzRes, 2); // x axis
HorzRes := Swap(HorzRes);
FileStream.Read(VertRes, 2); // y axis
VertRes := Swap(VertRes);
end
finally
FileStream.Free;
end;
end;
...
Рейтинг: 0 / 0
28.02.2011, 22:58
    #37140613
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как считать разрешение картинки
Используйте BlobMid() чтобы извлекать нужные участки файла (взамен Seek и Read).
полученные блобы преобразовывайте с помощью byte(), int(), в нужные типы данных.

Delphi <=> PB
byte = byte (PB10+) or char (PB9-)
word = int


Чем заменить Pos по блобу не помню.
...
Рейтинг: 0 / 0
28.02.2011, 23:03
    #37140618
Лампочка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как считать разрешение картинки
Anatoly Moskovsky, спасибо! надеюсь, хоть что-то смогу сделать)
...
Рейтинг: 0 / 0
01.03.2011, 10:16
    #37141041
umalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как считать разрешение картинки
База данных какая?
...
Рейтинг: 0 / 0
01.03.2011, 11:48
    #37141309
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как считать разрешение картинки
Лампочка ,
запустите скрипт, он выведет все данные о JPG файле
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
/*test.vbs*/
Set objShellApp = CreateObject("Shell.Application")
Set objFolder = objShellApp.NameSpace("...Здесь путь к каталогу с файлом test.jpg...")
Set objItem = objFolder.ParseName("test.jpg")
strResult = vbNullString
strResult = strResult & "Информация об файле """ & objItem.Path & """:" & vbCrLf
For i=- 1  To  40 
    strResult = strResult & i & " - " & objFolder.GetDetailsOf(objItem, i) & vbCrLf
Next
MsgBox strResult, vbInformation

Перевести в РВ думаю не сложно.

А для BMP (по Вашему методу) делал типа так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
/*РВ10.5*/
Int job
BLOB lb_data
ULONG lul_w, lul_h
string ls_file

job = FileOpen ( ls_file, StreamMode!, Read!)
FileReadEx (job, lb_data)

lul_w = Long(Integer(BlobMid(lb_data, 19 , 2 )),Integer(BlobMid(lb_data, 21 , 2 )))
lul_h = Long(Integer(BlobMid(lb_data, 23 , 2 )),Integer(BlobMid(lb_data, 25 , 2 )))
FileClose (job)

Messagebox("BMP", "Width: "+string( lul_w)+"~nHeight: "+string( lul_h))
...
Рейтинг: 0 / 0
01.03.2011, 12:28
    #37141393
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как считать разрешение картинки
Вот нашел интересную DLL - PortableDeviceWiaCompat.dll
По идее с ней можно не только размеры, и другие характеристики вытащить, но и корректно изменять эти файлы.
Но вот прикрутить к РВ не получилось. :(
...
Рейтинг: 0 / 0
01.03.2011, 19:38
    #37142778
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как считать разрешение картинки
Вот накропал примерный код, эквивалентный приведенному выше дельфийскому (но не проверял)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
public function integer of_get_image_size (readonly blob abb_image_data, 
                  ref unsignedinteger ai_width, ref unsignedinteger ai_height, 
                  ref string as_measure);
Long ll_i, ll_start =  0 
Byte lc_dp

// Find JFIF header start
For ll_i =  1  To Len(abb_image_data)
   If String(BlobMid(abb_image_data, ll_i,  4 )) = "JFIF" Then
      ll_start = ll_i
      Exit
   End If
Next
If ll_start =  0  Then Return - 1 

// Read measures
lc_dp = byte(BlobMid(abb_image_data, ll_start +  6 ,  1 ))
Choose Case lc_dp
   Case  1 
      as_measure = "DPI"
   Case  2 
      as_measure = "DPC"
   Case Else
      Return - 1 
End Choose

// Read resolution
ai_width = Integer(BlobMid(abb_image_data, ll_start +  7 ,  2 ))
ai_height = Integer(BlobMid(abb_image_data, ll_start +  9 ,  2 ))
// Reverse byte order
ai_width = Integer(ai_width *  256 ) + Integer(ai_width /  256 )
ai_height = Integer(ai_height *  256 ) + Integer(ai_height /  256 )

Return  1 
end function
...
Рейтинг: 0 / 0
01.03.2011, 21:45
    #37142959
Лампочка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как считать разрешение картинки
вот у меня в билдере 10 почему-то нет байта..поэтому я никак не могу считать measure. А разрешения все-таки сама сгодня накропала, поскольку инета на работе нет - и только что нашла все сообщения. Что можно сделать вместо byte? И всем спасибо!
...
Рейтинг: 0 / 0
01.03.2011, 22:48
    #37143012
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как считать разрешение картинки
Лампочкавот у меня в билдере 10 почему-то нет байта..поэтому я никак не могу считать measure. А разрешения все-таки сама сгодня накропала, поскольку инета на работе нет - и только что нашла все сообщения. Что можно сделать вместо byte? И всем спасибо!
PB10.5 Help. Standard datatypes. Byte
Код: plaintext
1.
2.
3.
4.
5.
 8 -bit unsigned integers, from  0  to + 255 .
Using literals  To assign a literal value, use any whole positive number in the range  0  to  255 .
The leading plus sign is not required ( 18  and + 18  are the same).
For example: 
 1   123   200  + 55  + 200 
...
Рейтинг: 0 / 0
02.03.2011, 09:27
    #37143342
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как считать разрешение картинки
Лампочкавот у меня в билдере 10 почему-то нет байта..поэтому я никак не могу считать measure. А разрешения все-таки сама сгодня накропала, поскольку инета на работе нет - и только что нашла все сообщения. Что можно сделать вместо byte? И всем спасибо!

Считывание байта из блоба в переменную типа long
Код: plaintext
1.
2.
3.
4.
5.
blob{ 4 } lbb_tmp
long ll_dc
BlobEdit(lbb_tmp,  1 , Long( 0 ))
BlobEdit(lbb_tmp,  1 , BlobMid(abb_image_data, ll_start +  6 ,  1 ) )
ll_dc = Long(lbb_tmp)
...
Рейтинг: 0 / 0
02.03.2011, 09:29
    #37143345
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как считать разрешение картинки
AISЛампочкавот у меня в билдере 10 почему-то нет байта..поэтому я никак не могу считать measure. А разрешения все-таки сама сгодня накропала, поскольку инета на работе нет - и только что нашла все сообщения. Что можно сделать вместо byte? И всем спасибо!
PB10.5 Help. Standard datatypes. Byte
Код: plaintext
1.
2.
3.
4.
5.
 8 -bit unsigned integers, from  0  to + 255 .
Using literals  To assign a literal value, use any whole positive number in the range  0  to  255 .
The leading plus sign is not required ( 18  and + 18  are the same).
For example: 
 1   123   200  + 55  + 200 

Тип byte появился начиная с 10.5
В 10, 10.2 его нет (не знаю о чем они думали).
...
Рейтинг: 0 / 0
02.03.2011, 12:28
    #37143792
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как считать разрешение картинки
Anatoly Moskovskyне знаю о чем они думали
Возможно это будет название темы для нового топика.
...
Рейтинг: 0 / 0
02.03.2011, 16:00
    #37144527
Dim2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как считать разрешение картинки
02.03.2011 9:29, Anatoly Moskovsky пишет:

> В 10, 10.2 его нет (не знаю о чем они думали).

О том же, о чём они думали, когда решили не добавлять в язык побитовые
логические операции...
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
02.03.2011, 18:19
    #37145053
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как считать разрешение картинки
Anatoly Moskovskyне знаю о чем они думали
Это было риторическое замечание.
Вряд ли имеет смысл перечислять все, над чем "они думали" - слишком длинный список.
:)
...
Рейтинг: 0 / 0
02.03.2011, 21:33
    #37145355
Лампочка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как считать разрешение картинки
Anatoly Moskovsky, спасибо! и всем вообще спасибо! в который раз так помогаете:)
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / как считать разрешение картинки / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]