Как превратить изображение в массив?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Sofist
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 04.02.2007 (Вс) 19:19

Как превратить изображение в массив?

Сообщение Sofist » 04.02.2007 (Вс) 19:31

Сталкнулся с такой задачей: необходимо картинку из PictureBox перегнать в массив. Пробывал это сделать так:
1. запрашивал цвет пикселя через PictureBox.Point(i,j)
2. загонял полученное значение в массив.
Но проблема в том, что картинку 320х240 такой алгоритм долго обрабатыват.
Подскажите как ускорить этот процесс? и есть ли API функция для решения этой задачи?
Заранее спасибо!!

Kolobuk
Обычный пользователь
Обычный пользователь
 
Сообщения: 61
Зарегистрирован: 24.10.2006 (Вт) 20:03

Сообщение Kolobuk » 04.02.2007 (Вс) 19:50

С картинками мало работал, но файл в массив загоняется просто:

Код: Выделить всё
Open "C:\Kuku.exe" For Binary As #1 Len = 1

Dim MAS() As Byte
ReDim MAS(LOF(1)) As Byte
Get #1, 1, MAS

Close #1

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Как превратить изображение в массив?

Сообщение tyomitch » 04.02.2007 (Вс) 20:15

Sofist писал(а):Подскажите как ускорить этот процесс? и есть ли API функция для решения этой задачи?

GetDIBits
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 04.02.2007 (Вс) 20:21

GetDIBits

[edit]
Что интересно - ответил я раньше Темыча, а пост отправился на 6 минут позже... более того, форму "Просмотреть сообщение" я так и не увидел, после нажатия кнопки "Отправить" форум завис. :|
[/edit]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Как превратить изображение в массив?

Сообщение Andrey Fedorov » 05.02.2007 (Пн) 0:23

tyomitch писал(а):
Sofist писал(а):Подскажите как ускорить этот процесс? и есть ли API функция для решения этой задачи?

GetDIBits


Э-э-э-х... А я так ждал ответа про твою оболочку... ;)
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

SyncM
Новичок
Новичок
Аватара пользователя
 
Сообщения: 32
Зарегистрирован: 04.02.2007 (Вс) 15:48

Сообщение SyncM » 05.02.2007 (Пн) 1:31

Попробуй вот так


Код: Выделить всё
Public Pica() As Long
ReDim Pica(pic.ScaleWidth, pic.ScaleHeight)
For Xa = 0 To pic.ScaleWidth
  For Ya = 0 To pic.ScaleHeight
    Pica(Xa, Ya) = pic.Point(Xa, Ya)
  Next
Next

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.02.2007 (Пн) 7:34

SyncM, вопрос-то прочитал? ;-)
Изображение

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 05.02.2007 (Пн) 10:44

Код: Выделить всё

Option Explicit

Private Type BITMAPINFOHEADER '40 bytes
        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
'---------------------------------------------------
Private Type BITMAPINFO
        bmiHeader As BITMAPINFOHEADER
        bmiColors As String * 1024
End Type

Private Declare Function GetDIBits Lib "gdi32" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long


Private Sub Command1_Click()
    PushPictureInBite Picture1
End Sub


Private Sub PushPictureInBite(pic As PictureBox)
    Dim bt() As Byte 'streem

Dim bim As BITMAPINFO
  bim.bmiHeader.biSize = 40
 
   If pic.Picture.Type <> 1 Then
        MsgBox "Ãðàíàòû íå òîé ñèñòåìû"
        Exit Sub
   End If
       
       
        Call GetDIBits(pic.hdc, pic.Picture.Handle, 0, 0, ByVal 0, bim, ByVal 0)
        ReDim bt(bim.bmiHeader.biSizeImage - 1)
        Call GetDIBits(pic.hdc, pic.Picture.Handle, 0, bim.bmiHeader.biHeight, ByVal VarPtr(bt(0)), bim, ByVal 0)
       
        ' RGB (0)
        'bt(0) -
        'bt(1) -
        'bt(2) -
       
        ' RGB (1)
        'bt(3) -
        'bt(4) -
        'bt(5) -
       
        '...
       
End Sub


Вернуться в Visual Basic 1–6

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

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

    TopList