Страница: 1 |
Страница: 1 |
Вопрос: Как считать картинку в массив попиксельно?
Добавлено: 27.09.05 06:52
Автор вопроса: weselij
Прошу помочь, может есть уже где пример, поделитесь ссылкой пожалуйста.
Ответы
Всего ответов: 12
Номер ответа: 1
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #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-сайт:
Профиль | | #3
Добавлено: 27.09.05 16:28
А чё не лучший то? Хотелось бы узнать лучший
имхо единственное, что тут напрягает, так это использование свойств объекта в цикле типа ширины и высоты
Номер ответа: 4
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #4
Добавлено: 27.09.05 21:29
2Страшный Сон, я верно отстал от жизни со своими старомодными решениями... предложи более совершенное решение
Номер ответа: 5
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #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-сайт:
Профиль | | #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-сайт:
Профиль | | #8
Добавлено: 27.09.05 23:13
Эхх разобраться бы получше. Но я пока поиск пошарю. Опа! скачал на исходниках архивчик, щас глянем. Зато вот чё я нашёл в рамблере по этому делу, ФАК одного из хорошо известных нам людей:
http://faqs.welcomeback.ru/faq/2/65/4733/index.html
Номер ответа: 9
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #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-сайт:
Профиль | | #10
Добавлено: 29.09.05 12:24
хм... айпи товарищ наш
Номер ответа: 11
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #11
Добавлено: 29.09.05 14:31
А это что за параметр ?
Номер ответа: 12
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #12
Добавлено: 29.09.05 16:18
Это графическая оптимизация, настраивающаяся в меню Файл>Make EXE....
Кста, это тут выигрыш тока в 100 раз, а если тестить просто рисование то там и больше будет наверное, так как расчёты то проводятся почти за одно время...
ЗЫ: А толку? Скоро идёт долбаная Vista