GetPixel и большие изображения

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

GetPixel и большие изображения

Сообщение artysite » 10.04.2007 (Вт) 10:10

Требуется занести значение цвета каждой точки Picturebox'а в массив с помощью GetPixel. Проблема в том, что если размер картинки больше размера формы, то данные о той части картинки, что не уместилась на форме, не воспринимаются GetPixel'ом. Подскажите как быть?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Re: GetPixel и большие изображения

Сообщение GSerg » 10.04.2007 (Вт) 10:12

artysite писал(а):Требуется занести значение цвета каждой точки Picturebox'а в массив с помощью GetPixel.

Ещё раз.
Требуется занести значение цвета каждой точки Picturebox'а в массив или же требуется с помощью GetPixel?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

artysite
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 16.05.2003 (Пт) 9:23

Re: GetPixel и большие изображения

Сообщение artysite » 10.04.2007 (Вт) 10:20

GSerg писал(а):Ещё раз.
Требуется занести значение цвета каждой точки Picturebox'а в массив или же требуется с помощью GetPixel?

Попытаюсь понятнее.
С помощью GetPixel'a забираю цвет всех точек PictureBox'a и помещаю в массив

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 10.04.2007 (Вт) 10:29

А зачем?
И почему GetPixel, а не Point?
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Re: GetPixel и большие изображения

Сообщение GSerg » 10.04.2007 (Вт) 10:33

artysite писал(а):Попытаюсь понятнее.

Понятнее не стало.
Повторю вопрос ещё раз: имеется требование использовать GetPixel, или же она используется просто потому, что ничего другого в голову не пришло?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

artysite
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 16.05.2003 (Пт) 9:23

Сообщение artysite » 10.04.2007 (Вт) 10:33

alibek писал(а):А зачем?


Чтобы потом обрабатывать изображения уже из массива, так быстрее получается

alibek писал(а):И почему GetPixel, а не Point?

Опять же GetPixel быстрее работает, но и Point не помогает при данной проблеме

artysite
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 16.05.2003 (Пт) 9:23

Re: GetPixel и большие изображения

Сообщение artysite » 10.04.2007 (Вт) 10:36

GSerg писал(а):
artysite писал(а):Попытаюсь понятнее.

Понятнее не стало.
Повторю вопрос ещё раз: имеется требование использовать GetPixel, или же она используется просто потому, что ничего другого в голову не пришло?

:) Не важно что использовать, главное загнать избражение в массив, и чтобы не слишком долго думала машина.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.04.2007 (Вт) 10:46

http://www.sysadmins.ru/rtfm/ask_howto.htm писал(а):Вопрос: Как можно с помощью X сделать Y?

Ответ: Если вы хотите сделать Y, надо так и спрашивать, не предполагая заранее использование метода, который может вовсе не подходить. Вопросы такого вида часто задают те, кто не просто ничего не знает об X, но сбит с толку решаемой проблемой Y и слишком сконцентрирован на деталях своей конкретной ситуации. Обычно лучше игнорировать таких людей, пока они не сформулируют свою проблему лучше.


Это первое, и второе - пользуйся поиском.
http://bbs.vbstreets.ru/viewtopic.php?t=30880
http://bbs.vbstreets.ru/viewtopic.php?t=29791
<куча других>
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ZET74
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 10.04.2007 (Вт) 17:47

Сообщение ZET74 » 10.04.2007 (Вт) 18:35

Я столкнулся с той же проблемой.
Изображение .bmp изначально лежит в файле. Нужно получить цвет пикселя, определенного координатами. Пробовал получать из picturebox с помощью .Point и GetPixel, но картинка большая, если координаты выходят за форму, то возвращается -1.
В каком направлении мыслить дальше?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.04.2007 (Вт) 18:43

Помысли, например, не прочитать ли ответ, идущий непосредственно перед твоим вопросом.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 11.04.2007 (Ср) 9:22

ZET74 из BMP файла можно получить цвет точки и не загружая его в пямять, тут было куча примеров для работы с BMP.
Программисты не глючат - глючат компиляторы...

X-hacker
Обычный пользователь
Обычный пользователь
 
Сообщения: 83
Зарегистрирован: 26.08.2006 (Сб) 1:22
Откуда: Moldova

Сообщение X-hacker » 12.04.2007 (Чт) 23:31

Код: Выделить всё
Type BITMAPINFOHEADER
Type TRGB
    B As Byte
    G As Byte
    R As Byte
End Type
Declare GetDIBits() 'Не забудь BITMAPINFO заменить на BITMAPINFOHEADER
'Сокращено в целях экономии места, юзай АпиВьювер

Private Sub GetPixels(IPicture As PictureBox, IWidth As Long, IHeight As Long, DestArray() As TRGB )
      Dim BM As BITMAPINFOHEADER

      With BM
          .bmWidth=IWidth
          .bmHeight=IHeight
          .bmSize=40
          .bmSizeImage=IWidth*IHeight*3
          .bmPlanes=1
      End With

      Redim DestArray(BM.bmWidth, BM.bmHeight)
   
      Call GetDIBits(IPicture.hDC, IPicture.Image,0,0,IHeight,DestArray(0,0),BM,0)
End Sub


Вроде так, просто у мня нет возможности проверить, я в клубе сижу.
Если сильно надо, дам рабочую вместе с кодом.
А гадости вроде GetPixel и SetPixel просто !забудь!

CoTaskMemFree
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 12.04.2007 (Чт) 19:23
Откуда: Из под бана

Сообщение CoTaskMemFree » 12.04.2007 (Чт) 23:36

Гадости? :roll:

ЗЫ. Интересно, что означает префикс I в аргументах функции GetPixels
It is Хакер.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 13.04.2007 (Пт) 15:00

На самом деле, функции шустрые. Их вызов вкупе с циклом из VB медленный.
Изображение

ZET74
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 10.04.2007 (Вт) 17:47

Сообщение ZET74 » 15.04.2007 (Вс) 10:30

X-hacker писал(а):Вроде так, просто у мня нет возможности проверить, я в клубе сижу.
Если сильно надо, дам рабочую вместе с кодом.
А гадости вроде GetPixel и SetPixel просто !забудь!
извините за тупость, разобраться не могу
Код: Выделить всё
Public 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



Public Type TRGB
    B As Byte
    G As Byte
    R As Byte
End Type
'Declare GetDIBits() 'Íå çàáóäü BITMAPINFO çàìåíèòü íà BITMAPINFOHEADER
Public 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 BITMAPINFOHEADER, _
        ByVal wUsage As Long) As Long
       
Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long


'Ñîêðàùåíî â öåëÿõ ýêîíîìèè ìåñòà, þçàé ÀïèÂüþâåð

Public Sub GetPixels(IPicture As PictureBox, IWidth As Long, IHeight As Long, DestArray() As TRGB)
      Dim BM As BITMAPINFOHEADER

      With BM
          .bmWidth = IWidth
          .bmHeight = IHeight
          .bmSize = 40
          .bmSizeImage = IWidth * IHeight * 3
          .bmPlanes = 1
      End With

      ReDim DestArray(BM.bmWidth, BM.bmHeight)
   
      Call GetDIBits(IPicture.hDC, IPicture.Image, 0, 0, IHeight, DestArray(0, 0), BM, 0)
End Sub
1) в функции getdibits 7 параметров, а в функции getpixels она вызывается с восемью параметрами. что лишнее?
2) как вызывать функцию getpixels? что писать в IPicture и DestArray()
3) еще раз извините за тупость

X-hacker
Обычный пользователь
Обычный пользователь
 
Сообщения: 83
Зарегистрирован: 26.08.2006 (Сб) 1:22
Откуда: Moldova

Сообщение X-hacker » 19.04.2007 (Чт) 15:50

Ноль там один лишний:
1 Контекст устройства
2 Указатель на битмап
3 Вроде первый индекс
4 Последний индекс(скольлко байт надо считать)
5 Указатель на массив или память
6 указатель на BitmapInfo
7 Способ применения (чаще всего ноль)

Вроде так :wink:

Кстати, если надо нарисовать точки, юзай SetPixelV() вместо SetPixel() ИМХО она быстрее!

Для вывода картинки юзай SetDIBitsToDevice()

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 20.04.2007 (Пт) 15:07

X-hacker
Есть более удобная StretchDIBits. Она помедленнее будет, но многое умеет.
Изображение

X-hacker
Обычный пользователь
Обычный пользователь
 
Сообщения: 83
Зарегистрирован: 26.08.2006 (Сб) 1:22
Откуда: Moldova

Re: GetPixel и большие изображения

Сообщение X-hacker » 22.04.2007 (Вс) 23:21

artysite писал(а):Требуется занести значение цвета каждой точки Picturebox'а в массив с помощью GetPixel. Проблема в том, что если размер картинки больше размера формы, то данные о той части картинки, что не уместилась на форме, не воспринимаются GetPixel'ом. Подскажите как быть?


keks-n
По-моему автор хотел спросить как получить байты изображения а не как сделать ресайз картинки, что вроде StretchDIBits() и делает и она ему вроде как не нужна.
artysite писал(а):На самом деле, функции шустрые. Их вызов вкупе с циклом из VB медленный.


Ничего подобного:

Си++:
Код: Выделить всё
{     
       DWORD      X;
       DWORD      Y;
       HDC           DC;
       
       DC=CreateDC("DISPLAY",NULL,NULL,NULL);
       for (X=0;X<500;X++)
             {
                    for (Y=0;Y<500;Y++);
                          {
                                  SetPixelV(DC,X,Y,255);  //Red Color
                           }
              }
}

VB:
Код: Выделить всё
      Dim X As Long,Y As Long,DC As Long
      DC=CreateDC("DISPLAY",vbNullString,vbNullString,vbNullString)
      For X=0 To 500
            For Y=0 To 500
                 Call SetPixelV(DC,X,Y,255)
            Next
      Next


Оба кода работают с одинаковой скоростью будь то сишный цикл или вб-шный, будь то GetPixel() или SetPixelV()

Вывод: функция работает медленнее минимального времени выполнения цикла и юзать GetDIBits() будет быстрее для больших изображений, ОДНАКО если нужно получить цвета нескольких точек в каком-либо математическо-рисовальном алг-ме то БЕЗУСЛОВНО лучше делать это с помощью GetPixel()

artysite
У PictureBox'a не забудь поставить AutoRedraw=True т.к. картинка может не только выходить за какие-либо рамки но и попросту быть невидимой.

ZET74
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 10.04.2007 (Вт) 17:47

Сообщение ZET74 » 23.04.2007 (Пн) 10:08

Если не трудно, напишите мне пожалуйсто конкретный пример от А до Я, который загружает файл в память и возвращает цвет по координатам X и Y


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

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

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 93

    TopList