Как извлечь png из архива

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

SlaDER
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 06.10.2005 (Чт) 16:54

Как извлечь png из архива

Сообщение SlaDER » 19.05.2007 (Сб) 20:35

Итак есть файл в который записаны картинки (Пример в аттаче)

Все картинки начинаются с:

‰PNG
...... бла-бла
и заканчиваются:

®B`‚

А перед\после каждой картинки могут быть произвольные байты.

Так вот, может кто подскажет алгоритм, как можно эти картинки извлечь?

Как конкретно считывать? Я делал так написал функцию readInt()

Код: Выделить всё
Public Function readInt() As Integer
        Dim d(3) As Byte
        Try
            fs.Read(d, 0, 4)
            Return (ToInt32(d(0)) << 24) Or (ToInt32(d(1)) << 16) Or (ToInt32(d(2)) << 8) Or ToInt32(d(3))
        Catch
            Return 0
        End Try
    End Function


Далее считываю и проверяю, если числовые значения равны, то начинаю запись в файл, если нет то на 3 позиции назад.

Проблема происходить, при нахождении конца картинки программа просто зацикливается!

P.S. Я поднимал уже этот вопрос, но так и не получил на него ответ, из-за плохой формулировки.)
Вложения
r.zip
(7.69 Кб) Скачиваний: 70

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 20.05.2007 (Вс) 14:45

Код: Выделить всё
    Sub ExtractImages()
        Dim Im As Image
        Dim SR As New FileStream("r.bin", FileMode.Open)
        Dim BR As New BinaryReader(SR)
        Dim B() As Byte = BR.ReadBytes(SR.Length)
        BR.Close() : SR.Close() : SR.Dispose()
        Dim StartPos, EndPos, Count As Integer

        Dim MS As New MemoryStream(B, StartPos, EndPos - StartPos + 1)
        Do
            StartPos = FindStart(B, StartPos)
            If StartPos = -1 Then Exit Do
            EndPos = FindEnd(B, StartPos + 4)
            If EndPos = -1 Then Exit Do
            Count += 1
            Im = Image.FromStream( _
                 New MemoryStream(B, StartPos, EndPos - StartPos + 1), True, True)
            'Запись выдранной картинки в файл
            Im.Save(Count.ToString & ".png", Imaging.ImageFormat.Png)
            StartPos = EndPos + 4
        Loop
        MsgBox("Extracted images: " & Count)
    End Sub

    Function FindStart(ByVal Arr() As Byte, ByVal pos As Integer) As Integer
        Dim FIndx As Integer
        FIndx = Array.IndexOf(Arr, CType(&H89, Byte), pos)
        Do While FIndx <> -1 AndAlso ((FIndx + 3) <= Arr.GetUpperBound(0))
            If Arr(FIndx + 1) = &H50 _
                AndAlso Arr(FIndx + 2) = &H4E _
                AndAlso Arr(FIndx + 3) = &H47 Then Return FIndx
            pos = FIndx + 1
            FIndx = Array.IndexOf(Arr, CType(&H89, Byte), pos)
        Loop
        Return -1
    End Function

    Function FindEnd(ByVal Arr() As Byte, ByVal pos As Integer) As Integer
        Dim FIndx As Integer
        FIndx = Array.IndexOf(Arr, CType(&HAE, Byte), pos)
        Do While FIndx <> -1 AndAlso ((FIndx + 3) <= Arr.GetUpperBound(0))
            If Arr(FIndx + 1) = &H42 _
                AndAlso Arr(FIndx + 2) = &H60 _
                AndAlso Arr(FIndx + 3) = &H82 Then Return FIndx
            pos = FIndx + 1
            FIndx = Array.IndexOf(Arr, CType(&HAE, Byte), pos)
        Loop
        Return -1
    End Function
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

SlaDER
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 06.10.2005 (Чт) 16:54

Сообщение SlaDER » 20.05.2007 (Вс) 17:47

Спасибо! Буду разбираться.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 63

    TopList