VB如何快速获取屏幕所有坐标的颜色值,是全部每一个点,保存在二维数组里面。

VB如何快速获取屏幕所有坐标的颜色值,是全部每一个点,保存在二维数组里面。,第1张

Private Type RGBQUAD

rgbBlue As Byte

rgbGreen As Byte

rgbRed As Byte

rgbAlpha As Byte '透明通道

End Type

Private 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

Private Type BITMAPINFO

bmiHeader As BITMAPINFOHEADER

bmiColors As RGBQUAD

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 Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long

Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long

Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long

Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long

Private Declare Function BitBlt Lib "gdi32" (ByVal hDCDest As Long, ByVal XDest As Long, ByVal YDest As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hDCSrc As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long

Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long

Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long

Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

Private Sub Command1_Click()

Dim hDCMemory As Long, hBmp As Long, hBmpPrev As Long, r As Long, hDCSrc As Long, hPal As Long, hPalPrev As Long

Dim LeftSrc As Long, TopSrc As Long, WidthSrc As Long, HeightSrc As Long, bytDataOut() As Byte, lngOut() As Long

Dim BitInfo As BITMAPINFO

Dim i As Long, j As Long

'修改下面4个参数就可以调整画面范围

LeftSrc = 0

TopSrc = 0

WidthSrc = 1024

HeightSrc = 768

hDCSrc = GetWindowDC(0) '(hWndSrc)

hDCMemory = CreateCompatibleDC(hDCSrc)

hBmp = CreateCompatibleBitmap(hDCSrc, WidthSrc, HeightSrc)

hBmpPrev = SelectObject(hDCMemory, hBmp)

r = BitBlt(hDCMemory, 0, 0, WidthSrc, HeightSrc, hDCSrc, LeftSrc, TopSrc, vbSrcCopy)

ReDim bytDataOut(2, WidthSrc - 1, HeightSrc - 1)

ReDim lngOut(WidthSrc - 1, HeightSrc - 1)

With BitInfobmiHeader

biBitCount = 24

biCompression = 0

biPlanes = 1

biSize = Len(BitInfobmiHeader)

biWidth = WidthSrc

biHeight = -HeightSrc

End With

GetDIBits hDCMemory, hBmp, 0, HeightSrc, bytDataOut(0, 0, 0), BitInfo, 0

hBmp = SelectObject(hDCMemory, hBmpPrev)

r = DeleteDC(hDCMemory)

r = ReleaseDC(hWndSrc, hDCSrc)

DeleteObject hBmp

For i = LeftSrc To WidthSrc - 1

For j = TopSrc To HeightSrc - 1

lngOut(i, j) = RGB(bytDataOut(0, i, j), bytDataOut(1, i, j), bytDataOut(2, i, j))

Next

Next

MsgBox "数据已存放在lngOut数组里面" & lngOut(5, 5)

End Sub

修改了下,这次没问题啦

b假如是原来的图像

Bitmap bmpOut = new Bitmap(sWidth, sHeight, PixelFormatFormat24bppRgb);

Graphics g = GraphicsFromImage(bmpOut);

gDrawImage(b, new Rectangle(0, 0, bWidth, bHeight), new Rectangle(pX, pY,sWidth, sHeight), GraphicsUnitPixel);

gDispose();

或者这样吧

Rectangle rg=new Rectangle(pX, pY,sWidth, sHeight);

g=GraphicsFromImage(bm1);

gDrawImage(b,rg);

return bmpOut;

您好,很高兴为您解答:

//根据坐标获取

ImageView imageView = ((ImageView)v);

Bitmap bitmap = ((BitmapDrawable)imageViewgetDrawable())getBitmap();

int pixel = bitmapgetPixel(x,y);

//获取颜色

int redValue = Colorred(pixel);

int blueValue = Colorblue(pixel);

int greenValue = Colorgreen(pixel);

​转载,仅供参考,如果我的回答没帮助到您,请继续追问。

嗯 ~~是这样的,。

1:你知道每个像素的坐标和灰度,那就知道图像的大小,定义一个固定的二维数组,把所有像素存入其中。

color ColorBuffer[WIDTH][HEIGHT] = {0};

ColorBuffer[i][j]b = ColorBuffer[i][j]g = ColorBuffer[i][j]r = colorzhi1//当前像素值,如果RGB一样。如果不一样则单独赋值;

2: 然后SaveBmp((LPSTR)(LPCTSTR)bmpname, WIDTH,HEIGHT, (unsigned char)ColorBuffer);

把ColorBuffer中的值转化成BMP

//bmpnameFormat("E:\\8位图像%dbmp",1);

3:保存还是直接显示就看你自己了

参考SaveBmp函数: 这是vc9下的,UNC字符集的。

void CSeekerDataDlg::SaveBmp(char filename,int height,int width,unsigned char data)

// 函数名 文件名指针 文件高度 文件宽度 文件数据指针

{

unsigned int size = width height 3 + 54;

struct BMPPIC

{

BITMAPFILEHEADER bitmapfileheader;

BITMAPINFOHEADER bitmapinfoheader;

}bitmap;

//写bmp文件信息头

bitmapbitmapinfoheaderbiSize = sizeof(BITMAPINFOHEADER);

bitmapbitmapinfoheaderbiWidth = width;

bitmapbitmapinfoheaderbiHeight = height;

bitmapbitmapinfoheaderbiPlanes = 1;

bitmapbitmapinfoheaderbiBitCount = 24; //24位

bitmapbitmapinfoheaderbiCompression = 0;

bitmapbitmapinfoheaderbiSizeImage = widthwidth3;

bitmapbitmapinfoheaderbiXPelsPerMeter = 0;

bitmapbitmapinfoheaderbiYPelsPerMeter = 0;

bitmapbitmapinfoheaderbiClrUsed = 256;

bitmapbitmapinfoheaderbiClrImportant = 256;

//写文件头

bitmapbitmapfileheaderbfType = 0x4D42; // 位图文件的类型,必须为BM

bitmapbitmapfileheaderbfSize = (DWORD)sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+ heightwidth3; //位图文件的大小,以字节为单位

bitmapbitmapfileheaderbfReserved1 = 0; // 位图文件保留字,必须为0

bitmapbitmapfileheaderbfReserved2 = 0; // 位图文件保留字,必须为0

bitmapbitmapfileheaderbfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); // 位图数据的起始位置,以相对于位图 // 文件头的偏移量表示,以字节为单位

int totaldLine=height;

int totalArray=width;

int lpitch=bitmapbitmapinfoheaderbiSizeImage/bitmapbitmapinfoheaderbiHeight;

int ipitch=bitmapbitmapinfoheaderbiWidth(bitmapbitmapinfoheaderbiBitCount/8);

//bitmapbuffer=(UCHAR)malloc(bitmapbitmapinfoheaderbiSizeImage);

//HANDLE fh;

// fh = CreateFile(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);

FILE fp = fopen(filename, "wb");

if (!fp) return;

fwrite((LPSTR)&bitmapbitmapfileheader, 1, sizeof(bitmapbitmapfileheader), fp);

fwrite((LPSTR)&bitmapbitmapinfoheader, 1,sizeof(bitmapbitmapinfoheader),fp);

fwrite(data, 1, size,fp); fclose(fp);

}

procedure TForm1Button2Click(Sender: TObject);

var

range:TBDColorRange;

Bit1,Bit2 : TBDBitmapData;

Left,Top : Integer;

b : Boolean;

target:String;

begin

Bit1:=TBDBitmapDataCreate; Bit2:=TBDBitmapDataCreate;

ranger:=5; rangeG:=5; rangeB:=5;

target:='1bmp';

if not Bit2LoadFromFile(target) then

begin

Bit1Free; Bit2Free; exit;

end;

Bit1CopyFormScreen();

b:=Bit1FindImage(Bit2,range,Left,Top);

if b then

begin

SetCursorPos(Left+20,Top+5) // 移到找到的图的坐标

end

else

Bit1Free;

Bit2Free;

end;

以上就是关于VB如何快速获取屏幕所有坐标的颜色值,是全部每一个点,保存在二维数组里面。全部的内容,包括:VB如何快速获取屏幕所有坐标的颜色值,是全部每一个点,保存在二维数组里面。、C# 已知坐标Point p,和Size s,怎样将这个范围内的图像变成Bitmap类型的数据呀、如何获取android界面某一个坐标点的颜色值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9293106.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存