我正在尝试自学C#,并从各种来源听说函数get和setpixel可能非常慢.有哪些替代方案,性能改进真的那么重要吗?提前致谢!
我的一大块代码供参考:
public static Bitmap Paint(Bitmap _b, Color f)
{
Bitmap b = new Bitmap(_b);
for (int x = 0; x < b.Width; x++)
{
for (int y = 0; y < b.Height; y++)
{
Color c = b.GetPixel(x, y);
b.SetPixel(x, y, Color.FromArgb(c.A, f.R, f.G, f.B));
}
}
return b;
}
Run Code Online (Sandbox Code Playgroud) 也许我看起来不够努力,但似乎所有东西都要我使用数组.因此,如果foo是这样的话,如何获取foo的特定像素的通道值Mat foo = imread("bar.png")?
我正在构建一个QT GUI应用程序并使用QImage打开图像.我的问题是我无法弄清楚如何使用QImage的bit()和scanline()方法来获得每像素级别的访问权限.
我已经看到这个Qt QImage像素操作问题, 但这仅适用于每一行的第一个像素.这是对的还是我错了?
提前致谢
我正在寻找一种从Mat(或Mat3b)变量编辑/读取像素的有效方法.
我用过 :-
Image.at<Vec3b>(i,j)
Run Code Online (Sandbox Code Playgroud)
但它似乎很慢.
我也用过这个: -
A.data[A.channels()*A.cols*i + j + 0]
Run Code Online (Sandbox Code Playgroud)
但我面临的问题是当我运行这个循环时
for(i=0; j<A.rows; i++){
for(j=0; j<A.cols; j++){
A.data[A.channels()*A.cols*i + j + 0] = 0;
A.data[A.channels()*A.cols*i + j + 1] = 0;
A.data[A.channels()*A.cols*i + j + 2] = 0;
}
}
Run Code Online (Sandbox Code Playgroud)
只有一部分图像变黑了.
我正在尝试为Windows应用程序制作一个自动登山者.它效果很好,但速度非常慢!我目前正在使用方法"getPixel",每次调用时都会重新加载一个数组.
这是我目前的代码:
hdc = GetDC(HWND_DESKTOP);
bx = GetSystemMetrics(SM_CXSCREEN);
by = GetSystemMetrics(SM_CYSCREEN);
start_bx = (bx/2) - (MAX_WIDTH/2);
start_by = (by/2) - (MAX_HEIGHT/2);
end_bx = (bx/2) + (MAX_WIDTH/2);
end_by = (by/2) + (MAX_HEIGHT/2);
for(y=start_by; y<end_by; y+=10)
{
for(x=start_bx; x<end_bx; x+=10)
{
pixel = GetPixel(*hdc, x, y);
if(pixel==RGB(255, 0, 0))
{
SetCursorPos(x,y);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
Sleep(50);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Sleep(25);
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以基本上,它只扫描屏幕中的一系列像素,并在检测到红色按钮时启动鼠标事件.
我知道还有其他方法可以获得像素颜色,例如bitblt.但是我做了一些研究,我不明白我应该怎么做,以便扫描一个颜色数组.我需要能够快速扫描屏幕的东西才能抓住按钮.
请你帮助我好吗?
谢谢.
我还在努力解决几天前我遇到的问题,但我还没有找到解决方案.但是,我一步一步到达那里.现在我遇到了另一个障碍.
我试图Bitmap.getpixel(int x, int y)返回Color用户使用的内容OnTouchListener.馅饼是一种VectorDrawable资源,vectordrawable.xml我不需要对像素数据做任何事情,我只需要测试它.所以我做了一个TextView会吐了出来的Color.
public class MainActivity extends AppCompatActivity {
ImageView imageView;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.imageView);
textView = (TextView) findViewById(R.id.textView);
imageView.setOnTouchListener(imageViewOnTouchListener);
}
View.OnTouchListener imageViewOnTouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
Drawable drawable = ((ImageView)view).getDrawable();
//Bitmap bitmap = BitmapFactory.decodeResource(imageView.getResources(),R.drawable.vectordrawable);
Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap();
int x = (int)event.getX();
int y = …Run Code Online (Sandbox Code Playgroud) android bitmap getpixel ontouchlistener android-vectordrawable
我想从另一个窗口获取像素颜色。我的代码是:
using System;
using System.Drawing;
using System.Runtime.InteropServices;
sealed class Win32
{
[DllImport("user32.dll")]
static extern IntPtr GetDC(IntPtr hwnd);
[DllImport("user32.dll")]
static extern Int32 ReleaseDC(IntPtr hwnd, IntPtr hdc);
[DllImport("gdi32.dll")]
static extern uint GetPixel(IntPtr hdc, int nXPos, int nYPos);
static public System.Drawing.Color GetPixelColor(int x, int y)
{
IntPtr hdc = GetDC(IntPtr.Zero);
uint pixel = GetPixel(hdc, x, y);
ReleaseDC(IntPtr.Zero, hdc);
Color color = Color.FromArgb((int)(pixel & 0x000000FF),
(int)(pixel & 0x0000FF00) >> 8,
(int)(pixel & 0x00FF0000) >> 16);
return color;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是此代码正在扫描整个屏幕,这不是我想要的。这个想法是修改代码以根据另一个应用程序屏幕边界扫描像素颜色。也许有 FindWindow 或 GetWindow 的东西?提前致谢。
我正在将图像导入 Excel,并尝试计算图像的用户定义区域的平均颜色。为此,用户创建一个边界,然后循环遍历屏幕像素以查看它们是否落在该边界内 - 如果落在该边界内,则该像素的 RGB 会添加到集合中,然后在最后进行平均。
我基本上已经让这一切正常工作,但是由于某种原因我的代码像素颜色检测错误。应该是黄色或蓝色像素(或任何其他颜色)的像素被记录为灰色阴影(通常为 16777215 或 13948116,以 Windows 十进制值表示)。
我假设 PixelColor 函数有问题,该函数旨在获取我输入的 XY 坐标的像素颜色(例如 -1107 或 830 等值),但必须返回某些颜色其他像素。我尝试根据鼠标光标所在的像素检测颜色的代码进行调整,但在尝试为其提供 XY 坐标而不是从光标位置获取坐标时显然出现了问题。
获取像素颜色并转换为RGB的代码如下:
Private Declare PtrSafe Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Declare PtrSafe Function GetCursorPos Lib "user32" (ByRef lpPoint As POINT) As LongPtr
Private Declare PtrSafe Function GetWindowDC Lib "user32" (ByVal hwnd As LongPtr) As LongPtr
Private Declare PtrSafe Function GetDC Lib "user32" (ByVal hwnd …Run Code Online (Sandbox Code Playgroud) 当我尝试执行下面的程序时:
import image
img = image.Image("LutherBellPic.jpg")
print(img.getWidth())
print(img.getHeight())
p = img.getPixel(45, 55)
print(p.getRed(), p.getGreen(), p.getBlue())
Run Code Online (Sandbox Code Playgroud)
我不断收到以下错误:
AttributeError: module 'image' has no attribute 'Image'
Run Code Online (Sandbox Code Playgroud) 我正在使用 npm:get-pixels 返回一个 ndarray 并且我在理解如何正确处理这个数组时遇到了一些麻烦。
假设像素是 ndarray
console.log(pixels.get(800, 200, 0));
console.log(pixels.get(800, 200, 1));
console.log(pixels.get(800, 200, 2));
Run Code Online (Sandbox Code Playgroud)
将打印图像坐标 [800,200] 处像素的 RGB 值。
我是否必须使用三个单独的 .get() 来实现这一点?
节点库
获取像素