powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как быстро получить параметры графич. файла: 1)размер 2)разрешение 3)глубина цвета
3 сообщений из 3, страница 1 из 1
Как быстро получить параметры графич. файла: 1)размер 2)разрешение 3)глубина цвета
    #37214691
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Относит. простой надеюсь вопрос.
Вопрос связан с моими последними темами:
1) размер
чтобы понять, надо ли переворачивать картинку и вписывать "в размер"
2) разрешение
чтобы понять удовлетворяет ли разрешение тому чего хотим 204х196 или 204х98
также чтобы понять не сжата ли картинка вдвое по высоте,если это tiff 204х98
3) глубина цвета (цветная or b/w)
чтобы понять надо ли применять HALFTONE
4) ?компрессия g3/g4/lzw (для tiff)

Все это есть обычно в свойствах файла
Размер конечно можно узнать так(Dimension):
Код: 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.
Function GetTiffInfo(FileName As String) As TiffInfo
    Dim objShell
    Dim objFolder
    Dim temp As String
    Dim i As Integer
    GetTiffInfo.Size = ""
    GetTiffInfo.Pages = ""
    GetTiffInfo.Dimension = ""
    'On Error GoTo TiffEnd
    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.NameSpace(GetFileDir(FileName))
    If (Not objFolder Is Nothing) Then
        Dim objFolderItem
        Set objFolderItem = objFolder.ParseName(GetFileName(FileName))
        If (Not objFolderItem Is Nothing) Then
            GetTiffInfo.Size = objFolder.GetDetailsOf(objFolderItem,  1 ) 'size of file
            GetTiffInfo.Pages = objFolder.GetDetailsOf(objFolderItem,  13 ) 'Pages
            GetTiffInfo.Dimension = objFolder.GetDetailsOf(objFolderItem,  26 ) 'Dimension
            'temp = ""
           ' For i = 1 To 100
           '     temp = temp & i & "=" & objFolder.GetDetailsOf(objFolderItem, i) & " "
           'Next i
           'MsgBox temp
        End If
        Set objFolderItem = Nothing
    End If
    Set objFolder = Nothing
    Set objShell = Nothing
TiffEnd:
End Function
Но это через одно место, тем более виста/win7 засаживают размер в 31-й параметр а не в 26-й

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

Смысл в том, что у нас на входе м.б. правильный уже файл, а мы его дербаним: вертим, масштабируем, мажем полутонами.
При этом еще тратим время и ресурсы.
Т.е. хочется сразу сразу понять: ТЫ КТО?
Чтобы наметить с ним ЧЕГО С ТОБОЙ ДЕЛАТЬ
...
Рейтинг: 0 / 0
Как быстро получить параметры графич. файла: 1)размер 2)разрешение 3)глубина цвета
    #37215327
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий773) глубина цвета (цветная or b/w)
чтобы понять надо ли применять HALFTONE
Ну, в принципе
Код: plaintext
1.
2.
3.
    If Not (PixelFormat = PixelFormat1bppIndexed) Then 'зачем тонировать если итак b/w
        SetStretchBltMode hdcDst1, HALFTONE
        SetBrushOrgEx hdcDst1,  0 ,  0 , tPt
    End If
А за одно и для вращения(если 2 преобразования, первое из которых поворот на 90)
Код: plaintext
1.
2.
3.
4.
5.
6.
    With bmiDst.bmiHeader
...
        If PixelFormat = PixelFormat1bppIndexed Then
            .biBitCount =  1 
        Else
            .biBitCount =  24 
        End If
Дмитрий771) размер
чтобы понять, надо ли переворачивать картинку и вписывать "в размер"
2) разрешение
чтобы понять удовлетворяет ли разрешение тому чего хотим 204х196 или 204х98
также чтобы понять не сжата ли картинка вдвое по высоте,если это tiff 204х98

Т.е. первые 3 пункта можно понять сразу после
Код: plaintext
    m_mfi.LoadFromFile strFile
по анализу первого фрейма.
Хотя конечно фреймы могут быть разные по размеру/разрешению/цветности/компрессии,
но это надо быть совсем дебилом, чтобы складывать tiff из разных картинок (это можно опустить...)

Осталось понять
Дмитрий774) ?компрессия g3/g4/lzw (для tiff)
Но насколько понимаю это свойство файла tiff, и к загруженному в m_mfi отношения не имеет, т.е. опять же возвращаемся к началу вопроса, как все узнать до.

Код: plaintext
    m_mfi.LoadFromFile strFile
-оно само занимает время (если там 50 страниц).... ?

Компрессию тоже надо понять. Если у меня на входе LZW, а на выходе должен быть строго Group4 , то пересохранять надо,
а если у меня уже Group4, зачем его сохранять в то же самое, да еще с возможной порчей...(rezersed bit order напр. винды испортят).
...
Рейтинг: 0 / 0
Как быстро получить параметры графич. файла: 1)размер 2)разрешение 3)глубина цвета
    #37225805
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эта тема решена:
Reading EXIF and Other Image Properties Using GDI+

Примерно так...
Код: 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.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
Public Function showEXIFTags(ByVal sFilename As String) As String
    Dim retStatus As Status
    Dim m_img As Long
    Dim PropertyCount As Long
    Dim prop As GDIPPropertyItem
    Dim i As Long
    Dim sItem As String
    Dim j As Long
    Dim v As Variant
    Dim s As String
    Dim strFull As String
    
    strFull = ""
    
    retStatus = Execute(StartUpGDIPlus(GdiPlusVersion))
    If retStatus = OK Then
        GdipInitialized = True
    Else
        showEXIFTags = "GDI Problem!"
        Exit Function
    End If
    retStatus = Execute(GdipLoadImageFromFile(StrPtr(sFilename), m_img))
    If retStatus = OK Then
        Call Execute(GdipGetPropertyCount(m_img, PropertyCount))
        For i =  1  To PropertyCount
            Set prop = PropertyItem(i, PropertyCount, m_img)
            sItem = CStr(i) & " " & prop.Name & " "
      
            Select Case prop.ItemType
            Case PropertyTagTypeASCII
                sItem = sItem & prop.ParseString()
         
            Case PropertyTagTypeRational, PropertyTagTypeSRational
                For j =  1  To prop.ValueCount
                    If (j >  1 ) Then
                        sItem = sItem & ", "
                    End If
                    v = prop.ParseRational(j)
                    'sItem = sItem & v(1) & "/" & v(2)
                    sItem = sItem & CStr(v( 1 ) / v( 2 ))
                Next j
         
            Case PropertyTagTypeLong
                For j =  1  To prop.ValueCount
                    If (j >  1 ) Then
                        sItem = sItem & ", "
                    End If
                sItem = sItem & prop.ParseLong(j)
            Next j
      
            Case PropertyTagTypeShort
                For j =  1  To prop.ValueCount
                    If (j >  1 ) Then
                        sItem = sItem & ", "
                    End If
                    sItem = sItem & prop.ParseShort(j)
                Next j
      
            Case PropertyTagTypeUndefined
                ReDim b( 0  To prop.ValueCount -  1 ) As Byte
                prop.GetData b
                For j =  1  To prop.ValueCount -  1 
                    If (j >  1 ) Then
                        sItem = sItem & " "
                    End If
                    s = Hex(b(j -  1 ))
                    If Len(s) =  1  Then s = "0" & s
                    sItem = sItem & s
                Next j
      
            Case Else
                sItem = sItem & prop.ItemType & " " & prop.length
            End Select
            If Right(sItem,  1 ) = Chr( 0 ) Then 'убрать нулевой символ на конце
                sItem = Left(sItem, Len(sItem) -  1 )
            End If
            strFull = strFull & sItem & vbCrLf
        Next i
    Else
        strFull = "Not a graphic file!"
    End If
    showEXIFTags = strFull
    retStatus = Execute(GdipDisposeImage(m_img))
    If GdipInitialized = True Then
        retStatus = Execute(ShutdownGDIPlus)
    End If
End Function
Не, ну все таки на этом сайте действительно какие-то акселераты, если не сказать дебилы (в своем роде).
Чтоб до такой степени все запутать и накрутить, да еще и бывает проект не запускается.
Короче пришлось все с нуля переделывать пошагово.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как быстро получить параметры графич. файла: 1)размер 2)разрешение 3)глубина цвета
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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