我在VB.NET中使用相机(在这种情况下是单色).相机的API使用C++,制造商提供包装.在这些情况下通常,图像作为Byte数组返回.在我的特定情况下,它是每像素8位,所以没有花哨的比特包撤消.
我惊讶于.NET对这类事物的支持很少.网上搜索,我发现不同的主题,但它并不能帮助,在许多情况下,人们都对应图像数据的字节数组(即,读取图像文件转换成字节数组,然后让.NET数组解释为一个文件,标题和一切).
在这种情况下,我需要将原始像素值数组转换为特别是我可以在屏幕上显示的内容.
似乎没有被任何内置的方式做到这一点,因为内置到.NET的8bpp的格式索引(需要一个调色板),但它似乎并不设置调色板支持.再次,这真的让我感到惊讶.这是我发现的最有希望的话题.
所以我发现这样做的唯一方法是创建一个Bitmap然后逐个像素地复制像素值.在我的情况下,使用时,最快的i7上的8 MPixel图像需要几秒钟SetPixel.
我发现使用的替代方法SetPixel是LockBits,它允许您访问构成图像的(非托管)字节数组.这似乎很浪费,因为我必须在.NET中操作数组,然后将其复制回非管理空间.我已经复制了原始图像数据一次(因此原始图像可以重复使用或被其余部分丢弃),所以虽然比使用SetPixel它还要快得多但仍然看起来很浪费.
这是我的VB代码:
Public Function GetBitmap(ByRef TheBitmap As System.Drawing.Bitmap) As Integer
Dim ImageData() As Byte
Dim TheWidth, TheHeight As Integer
'I've omitted the code here (too specific for this question) which allocates
'ImageData and then uses Array.Copy to store a copy of the pixel values
'in it. It also assigns the proper values to TheWidth and TheHeight.
TheBitmap …Run Code Online (Sandbox Code Playgroud) 我觉得C中的三分指针被视为"坏".对我来说,有时使用它们是有道理的.
从基础开始,单指针有两个目的:创建数组,并允许函数更改其内容(通过引用传递):
char *a;
a = malloc...
Run Code Online (Sandbox Code Playgroud)
要么
void foo (char *c); //means I'm going to modify the parameter in foo.
{ *c = 'f'; }
char a;
foo(&a);
Run Code Online (Sandbox Code Playgroud)
在双指针可以是2D阵列(或阵列的阵列中,由于每个"列"或"行"不必具有相同的长度).我个人喜欢在需要传递一维数组时使用它:
void foo (char **c); //means I'm going to modify the elements of an array in foo.
{ (*c)[0] = 'f'; }
char *a;
a = malloc...
foo(&a);
Run Code Online (Sandbox Code Playgroud)
对我来说,这有助于描述foo正在做什么.但是,没有必要:
void foo (char *c); //am I modifying a char or just passing a char array?
{ c[0] = …Run Code Online (Sandbox Code Playgroud) 我正在尝试登录网站并自动保存HTML页面(我希望能够定期执行此操作).从表面上看,这是一个典型的现代网站,如果用户直接导航到"锁定"URL,则会弹出登录表单,登录后,用户将被重定向到目标页面.
我给了机械化一个镜头(http://wwwsearch.sourceforge.net/mechanize/),但它没有找到登录所需的一些表单元素(隐藏元素有一些值由javascript函数放入,当时运行用户单击"登录"按钮).
我在.NET中使用"网络浏览器"控件玩了一下但很快就失去了兴趣,因为我甚至无法在Google页面上提交查询.
我不在乎语言是什么; 我会学习它来解决这个问题.至少它必须在Windows中工作.
一个简单的例子,比如在Google搜索框中输入查询将是一个很好的奖励.
我有一组使用 创建的 docker 容器docker compose,它创建了一个“用户定义的”桥接网络。
这些 docker 容器之一正在运行DNSmasq,因此我们可以定义自定义(内部)域名来指向本地 IP。
问题是,其他 docker 容器都无法解析这些域名。我认为问题是我无法让 docker DNS 将其请求转发到运行 DNSmasq 的 docker 容器(即它甚至不知道它存在)。
作为测试,我做了一个docker network inspect <network created by docker compose>并记录了 DNSmasq 容器的 IP 地址。然后,在其他容器之一中/etc/resolv.conf,我设置nameserver为该 IP 地址。然后我就可以解析所有这些内部域名。
遗憾的是,dnsmasq尽管用户定义的网络启用了自动服务发现,但放置在那里并不起作用。
似乎完成这项工作的一种方法是强制我的 DNSmasq 容器始终具有相同的 IP,然后确保其他 docker 容器指向该 IP 作为其名称服务器,例如通过在compose 文件中显式定义网络。
难道就没有别的办法了吗?当我只想知道一个容器的 IP 地址时,我宁愿不必定义整个网络来复制这个自动创建的网络。
有关MFC项目如何处理的特殊内容吗?
这是场景.我喜欢在h文件中定义类成员函数,而不是在两个文件之间拆分类.
在Visual Studio中,我可以创建一个空的Win32项目,并执行以下操作:
main.cpp中:
#include "doubleDef.h"
int main()
{
doubleDef t;
t.func();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
doubleDef.h:
#pragma once
class doubleDef
{
public:
int func();
};
int doubleDef::func()
{
return 4;
}
Run Code Online (Sandbox Code Playgroud)
这构建得很好.
如果我doubleDef.h进入一个MFC对话框项目,并添加#include "doubleDef.h"到h主对话框的文件,我得到LNK2005,说func已经定义,使它看起来好像#pragma once被忽略了.
如果我改为包含doubleDef.h在主对话框的cpp文件中,一切都很好.但在空的Win32中我可以doubleDef.h通过这样做"多次" 包含:
Header.h
#pragma once
#include "doubleDef.h"
Run Code Online (Sandbox Code Playgroud)
那么header1.h
#pragma once
#include "doubleDef.h"
Run Code Online (Sandbox Code Playgroud)
main.cpp中:
#include "Header.h"
#include "Header1.h"
int main()
{
doubleDef t;
t.func();
return 0;
} …Run Code Online (Sandbox Code Playgroud) 我在尝试在 Windows 7 中广播 UDP 数据包时遇到此错误。
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto("hello".encode("ascii"), ("<broadcast>", 5868))
Run Code Online (Sandbox Code Playgroud)
如果我更改为 255.255.255.255,同样的交易。如果我输入特定的 IP 地址(包括 127.0.0.1),它就可以正常工作。同样的方法(即,将数据包发送到 255.255.255.255)也适用于 .NET。
这不受 Windows 防火墙的影响(尝试将其关闭)。我是管理员,UAC 已关闭,即使使用“以管理员身份运行”也不起作用。不知何故,我不认为这是一个实际的权限问题。
我有一个位图存储为BGRA字节数组.这是我用来绘制位图的代码:
CDC *dispDC = new CDC();
dispDC->CreateCompatibleDC(pDC);
CBitmap *dispBMP = new CBitmap();
dispBMP->CreateCompatibleBitmap(pDC, sourceImage->GetWidth(), sourceImage->GetHeight());
dispDC->SelectObject(this->dispBMP);
Run Code Online (Sandbox Code Playgroud)
实际复制translatedImage数组中的像素时会发生以下情况:
dispBMP->SetBitmapBits(sourceImage->GetArea() * 4, translatedImage);
Run Code Online (Sandbox Code Playgroud)
经过一些处理之后,我打电话pDC->StretchBlt给dispDC作为源CDC.这在本地登录时工作正常,因为显示也设置为32bpp.
一旦我使用远程桌面登录,显示屏将变为16bpp并且图像被破坏.罪魁祸首是SetBitmapBits; 即为了它的工作,我必须正确填写translatedImage我想要显示的16bpp版本.我没有自己这样做,而是搜索了文档,发现SetDIBits它听起来像我想要的那样:
SetDIBits函数使用在指定DIB中找到的颜色数据设置兼容位图(DDB)中的像素.
在我的例子中,DIB是32bpp RGBA数组,而DDB是dispBMP我创建的CreateCompatibleBitmap.
所以不是我的号召SetBitmapBits,这就是我所做的:
BITMAPINFO info;
ZeroMemory(&info, sizeof(BITMAPINFO));
info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
info.bmiHeader.biBitCount = 32;
info.bmiHeader.biPlanes = 1;
info.bmiHeader.biCompression = BI_RGB;
info.bmiHeader.biSizeImage = sourceImage->GetArea()*4;
info.bmiHeader.biWidth = sourceImage->GetWidth();
info.bmiHeader.biHeight = sourceImage->GetHeight();
info.bmiHeader.biClrUsed = 0;
int r = SetDIBits(pDC->GetSafeHdc(), (HBITMAP)dispBMP,
0, …Run Code Online (Sandbox Code Playgroud) 我为输出文件名选择编写了一个自定义控件,其中包含文件名的典型:文本框,"浏览"按钮以及特定于我的应用程序的一些其他功能.
文本框根据文件名更改颜色.如果无法写入文件位置,则会变为红色.如果文件已存在,则变为黄色.否则,它仍然是系统指定的颜色.
要查看文件是否存在,我使用IO.File.Exists; 很简单.
我实现了"如果文件可以写入"作为一个简单的try-catch块,其中文件实际打开,写入其中,关闭,然后删除.如果在任何时候抛出异常,我知道用户不能使用该文件名,我将文本框变为红色.
这是一个全能的; 因为我正在做我打算做的实际操作,所以它是万无一失的.然而,让软件创建和删除疯狂的文件似乎是不负责任的,只是为了看它是否可以.
所以我的问题是,如何在不创建文件的情况下复制此功能?我可以看到我必须:
还有别的事吗?
编辑
几分钟内,我看到人们都已经投票最多的是批评,我正在检查一个答案在所有该文件是它发生的实际写入之前访问.虽然我很欣赏专家从我的问题中"退后一步",看看是否有完全不同的方法来实现它,告诉我我不应该这样做,这不是我的问题的答案.
所以让我详细说明我的应用程序(我不希望同时有数百个用户).
我在数据采集应用程序中使用此文件选择器控件.在许多情况下,您即将运行的测试以某种方式"昂贵".因此,非常谨慎地进行设置至关重要.覆盖数据可能非常昂贵(对于可怕的用户,我有一个复选框,将日期和时间追加到毫秒到文件名).
因此,我的指示器颜色的目的不是为软件提供一个确定文件可以写入的确定方式(该检查仍然在它实际必须的时刻完成),它是作为用户的指示器,至少他已正确设置文件名,所以如果他继续前进,他保证不会覆盖旧数据,他几乎可以确定最后一分钟的IO错误(文件名错误)不会让实验运行未记录.