Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Как считать картинку в массив попиксельно? Добавлено: 27.09.05 06:52  

Автор вопроса:  weselij
Прошу помочь, может есть уже где пример, поделитесь ссылкой пожалуйста.

Ответить

  Ответы Всего ответов: 12  

Номер ответа: 1
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #1
Добавлено: 27.09.05 10:45
а что тут сложного, чтобы писать пример?


redim arr(picture1.scalewidth, picture1.scaleheight)

for i = 1 to picture1.scalewidth
    for j = 0 to picture1.scalewidth
        arr(i, j) = getpixel(i, j)
    next
next

Ответить

Номер ответа: 2
Автор ответа:
 Страшный Сон



Вопросов: 46
Ответов: 848
 Профиль | | #2 Добавлено: 27.09.05 15:52
Это не лучший способ.

Ответить

Номер ответа: 3
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #3
Добавлено: 27.09.05 16:28
А чё не лучший то? Хотелось бы узнать лучший :)
имхо единственное, что тут напрягает, так это использование свойств объекта в цикле типа ширины и высоты

Ответить

Номер ответа: 4
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #4
Добавлено: 27.09.05 21:29
2Страшный Сон, я верно отстал от жизни со своими старомодными решениями... предложи более совершенное решение :)

Ответить

Номер ответа: 5
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #5
Добавлено: 27.09.05 21:55
А ну это типа если бы можно было сразу двухмерный массив приравнять картинке (тоже же матрица), вот я бы тогда был бы очень счастлив :))

Ответить

Номер ответа: 6
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #6 Добавлено: 27.09.05 22:49
Да на здоровье.
GetDIBits, SetDIBits.

Ответить

Номер ответа: 7
Автор ответа:
 Victor



ICQ: 345743490 

Вопросов: 42
Ответов: 385
 Web-сайт: vt-dbnz.narod.ru
 Профиль | | #7
Добавлено: 27.09.05 23:13



Public Declare Function CreateCompatibleBitmap Lib "gdi32" _
            ;(ByVal hDC As Long, _
            ByVal nWidth As Long, _
            ByVal nHeight As Long) As Long

Public Declare Function GetDiBits Lib "gdi32" Alias "GetDIBits" _
            ;(ByVal hDC As Long, _
            ByVal hBitmap As Long, _
            ByVal nStartScan As Long, ByVal nNumScans As Long, _
            ByRef lpBits As Any, lpBI As BITMAPINFO, _
            ByVal wUsage As Long) As Long

Public Declare Function SelectObject Lib "gdi32" _
            ;(ByVal hDC As Long, _
            ByVal hObject As Long) As Long

Public Declare Function DeleteObject Lib "gdi32" _
            ;(ByVal hObject As Long) As Long


Type RGBQUAD
    b As Byte
    g As Byte
    r As Byte
    Reserved As Byte
End Type

Type BITMAPINFOHEADER
        biSize As Long
        biWidth As Long
        biHeight As Long
        biPlanes As Integer
        biBitCount As Integer
        biCompression As Long
        biSizeImage As Long
        biXPelsPerMeter As Long
        biYPelsPerMeter As Long
        biClrUsed As Long
        biClrImportant As Long
End Type

Type BITMAPINFO
        bmiHeader As BITMAPINFOHEADER
        bmiColors As RGBQUAD
End Type

Public Const DIB_RGB_COLORS = 0 '  color table in RGBs


Public Function GetImage(ByRef Ary() As RGBQUAD, hDC As Long, hBMP As Long)
Dim BMI As BITMAPINFO
Dim w As Long, h As Long

With BMI.bmiHeader
    .biSize = Len(BMI.bmiHeader)
End With

GetDiBits hDC, hBMP, 0, 1, ByVal 0&, BMI, DIB_RGB_COLORS

With BMI.bmiHeader
    w = .biWidth
    h = Abs(.biHeight)
    .biBitCount = 32
    .biHeight = -h
End With

If w <= 0 Or h <= 0 Then
    Err.Raise 11111, "GetImage", "Failed."
End If

ReDim Ary(0 To w - 1, 0 To h - 1)

GetDiBits hDC, hBMP, 0, h, Ary(0, 0), BMI, DIB_RGB_COLORS

End Function


Пример вызова:

Private Sub Command1_Click()
Dim Ary() As RGBQUAD
GetImage Ary, Picture1.hDC, Picture1.Image.handle
Stop
End Sub

Примечание. Использование не согласуется с документацией в том плане, что там при вызове функции требуется, чтобы Bitmap не был выбран в DC'шник. Однако все работает.

Можно по другому. Использовать CreateDIBSection, а потом BitBlt туда из PictureBox. Пример писать не буду.

Ответить

Номер ответа: 8
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #8
Добавлено: 27.09.05 23:13
Эхх разобраться бы получше. Но я пока поиск пошарю. Опа! скачал на исходниках архивчик, щас глянем. Зато вот чё я нашёл в рамблере по этому делу, ФАК одного из хорошо известных нам людей:
http://faqs.welcomeback.ru/faq/2/65/4733/index.html
:)

Ответить

Номер ответа: 9
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #9
Добавлено: 28.09.05 19:56
Так нифига себе, упустил я однако эту парочку фунций и стока времени фигнёй страдал :) вот некоторые тесты, например, преобразование цветной картинки (большущей) в чёрно белую прохожило вот так:

Запуск из VB:
Пример из билиотеки (попиксельно): ~15.75 секунд
С использованием GetDIBits,SetDIBits: ~ 0.85 секунд

И ещё более радостно, запуск откомпилиного проэкта:
Попиксельно: 10.94
GetDIBits, SetDIBits: 0.078 !

Ответить

Номер ответа: 10
Автор ответа:
 Barsik



Разработчик Offline Client

ICQ: 343368641 

Вопросов: 17
Ответов: 686
 Web-сайт: barsik.newmail.ru
 Профиль | | #10
Добавлено: 29.09.05 12:24
хм... айпи товарищ наш :)

Ответить

Номер ответа: 11
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #11
Добавлено: 29.09.05 14:31
И ещё более радостно, запуск откомпилиного проэкта:

А это что за параметр :) ?

Ответить

Номер ответа: 12
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #12
Добавлено: 29.09.05 16:18
А это что за параметр :) ?

Это графическая оптимизация, настраивающаяся в меню Файл>Make EXE....


Кста, это тут выигрыш тока в 100 раз, а если тестить просто рисование то там и больше будет наверное, так как расчёты то проводятся почти за одно время...

ЗЫ: А толку? Скоро идёт долбаная Vista

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам