artysite писал(а):Требуется занести значение цвета каждой точки Picturebox'а в массив с помощью GetPixel.
GSerg писал(а):Ещё раз.
Требуется занести значение цвета каждой точки Picturebox'а в массив или же требуется с помощью GetPixel?
artysite писал(а):Попытаюсь понятнее.
alibek писал(а):А зачем?
alibek писал(а):И почему GetPixel, а не Point?
GSerg писал(а):artysite писал(а):Попытаюсь понятнее.
Понятнее не стало.
Повторю вопрос ещё раз: имеется требование использовать GetPixel, или же она используется просто потому, что ничего другого в голову не пришло?
http://www.sysadmins.ru/rtfm/ask_howto.htm писал(а):Вопрос: Как можно с помощью X сделать Y?
Ответ: Если вы хотите сделать Y, надо так и спрашивать, не предполагая заранее использование метода, который может вовсе не подходить. Вопросы такого вида часто задают те, кто не просто ничего не знает об X, но сбит с толку решаемой проблемой Y и слишком сконцентрирован на деталях своей конкретной ситуации. Обычно лучше игнорировать таких людей, пока они не сформулируют свою проблему лучше.
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
извините за тупость, разобраться не могу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
artysite писал(а):Требуется занести значение цвета каждой точки Picturebox'а в массив с помощью GetPixel. Проблема в том, что если размер картинки больше размера формы, то данные о той части картинки, что не уместилась на форме, не воспринимаются GetPixel'ом. Подскажите как быть?
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
}
}
}
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
Сейчас этот форум просматривают: AhrefsBot и гости: 93