如何在C#中使用GDI从图像创建每像素1位掩码?我试图创建掩码的图像保存在System.Drawing.Graphics对象中.
我见过在循环中使用Get/SetPixel的例子,这些例子太慢了.我感兴趣的方法是只使用BitBlits的方法,就像这样.我只是不能让它在C#中工作,任何帮助都非常感谢.
我有一个有网格的控件.每次使用设备上下文类中的绘制线函数绘制构成网格的水平和垂直线是否更昂贵,或者将网格绘制一次到内存设备上下文然后再次将其blit更快窗口直流?谢谢.
我是否需要在OnPaint事件中通过PaintEventArgs获取的Graphics对象上调用Dispose()?
有没有办法让窗口处理窗口拥有win32 DC?或者任何其他可能对识别窗口有用的信息,如DC宽度和高度?
在了解如何生成图像,绘制图像,在其上写文本等基本步骤方面,我已经熟悉System.Drawing命名空间.但是,对于接近打印质量的任何事情来说,它都是如此慢.我已经看到一些建议使用COM与本机Windows GDI交谈以更快地完成此操作,但我想知道是否有任何优化我可以进行高速,高质量的图像生成.我尝试过使用抗锯齿选项,并且可以立即使用图形,位图和图像对象,但是我可以采用其他任何技术来实现这种高速度吗?
写这个我只是想到使用.Net 4中的任务库做更多工作,即使每个生成任务都不会更快.
无论如何,思想和评论赞赏.
谢谢!
我有以下ImageObject类:
public class ImageObject
{
public static Image CropImage(Image img, Rectangle cropArea)
{
Bitmap bmpImage = new Bitmap(img);
Bitmap target = new Bitmap(cropArea.Width, cropArea.Height);
using(Graphics g = Graphics.FromImage(target))
{
g.DrawImage(bmpImage, new Rectangle(0, 0, target.Width, target.Height), cropArea, GraphicsUnit.Pixel);
g.Dispose();
}
return (Image)target;
}
public static Image ResizeImage(Image imgToResize, Size size)
{
int sourceWidth = imgToResize.Width;
int sourceHeight = imgToResize.Height;
float nPercent = 0;
float nPercentW = 0;
float nPercentH = 0;
nPercentW = ((float)size.Width / (float)sourceWidth);
nPercentH = ((float)size.Height / (float)sourceHeight); …Run Code Online (Sandbox Code Playgroud) 我有一个图像,即使用Windows GDI调用(24 bpp)绘制,我需要将此图像转换为16 bpp.这是在Windows Mobile上.
24 bpp - RGB (rrrrrrrr gggggggg bbbbbbbb)
16 bpp - RGB (rrrrr gggggg bbbbb)
Run Code Online (Sandbox Code Playgroud)
为此,我使用以下代码
for (int x = 0; x < iScreenSize; x++)
{
*iPixel1= (*iPixel & 0x0000001F) |
(*iPixel & 0x00003F00) >> 3 |
(*iPixel & 0x001F0000) >> 5;
}
Run Code Online (Sandbox Code Playgroud)
代码工作正常但性能不是很好,因为我逐个像素地修改.你能否建议对这种转换进行任何改进?
提前致谢
我正在使用StretchDIBits打印图像,当图像由于某种未知原因而处于特定大小时,它会失败.
图像数据从24位BGR格式的某些其他图像源加载到unsigned int数组中.我已经验证了图像和缓冲区完全没问题,因为就像我说的那样,它可以在某些尺寸上工作但根本不工作.
我正在测试的当前尺寸是638x1014.如果我将高度更改为1013它可以正常工作,但由于某种原因,如果它是1014,它就会失败.
这里有一些代码向您展示如何设置它们:
unsigned int * buffer = new unsigned int[width * height * 3];
// Fill buffer with image data...
BITMAPINFOHEADER bi = { 0 };
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = width;
bi.biHeight = height;
bi.biPlanes = 1;
bi.biBitCount = 24;
bi.biCompression = BI_RGB;
bi.biSizeImage = width * height * 3; // Specifying this value because if I don't it will crash trying to read outside of the buffer.
StartPage(hdcPrint);
SetMapMode(hdcPrint, MM_ISOTROPIC);
SetWindowExtEx(hdcPrint, width, height, …Run Code Online (Sandbox Code Playgroud) 我正在艰难地围绕如何计算出裁剪任何高宽比超过4:3到4:3的图像的数学.
例如,我可能有一些16:9的图像,我希望调整大小然后裁剪为4:3.
调整大小我已经工作了,但它保持相同的宽高比.我知道我需要使用Graphics.DrawImage()但是我不完全确定参数应该是什么以及我如何得出这些参数.
这就是我所知道的:
var dimension = (double)bigSide/smallSide
if(dimension > 1.4)
{
Graphics.DrawImage(resImage, new Rectangle(?, ?, ?, ?), ?, ?, ?, ?, GraphicsUnit.Pixel);
}
Run Code Online (Sandbox Code Playgroud)
所有这些问号都是我不理解的参数.我也不确定将图像缩小到4:3需要什么样的数学运算.
基本上我只是希望切割比4:3宽度更宽的图像(中心).显然,我会剪切图像的顶部和底部,而不是横向.
任何帮助将不胜感激.
TIA
我正在尝试将像素数组转换HBITMAP为本文中的指示: 如何将像素数组转换为HBITMAP.
基本上,数组被转换为a HBITMAP然后通过复制到剪贴板进行验证.但是,当BITMAP通过其bmBits成员从构造中访问位值时,它将返回NULL.
我可能在这里缺少一些东西.如果a HBITMAP成功创建,为什么我们仍然得到一个NULL指向其位值的指针?
uint8 width = 160;
uint8 height = 120;
uint8* pixels = new uint8[160 * 120 * 4];
for (int i = 0; i < 160 * 120 * 4; i++){
pixels[i] = (i % 4 == 1) * 255; // testing pixels
}
BITMAPINFOHEADER bmih;
bmih.biSize = sizeof(BITMAPINFOHEADER);
bmih.biWidth = width;
bmih.biHeight = -1 * height;
bmih.biPlanes = 1;
bmih.biBitCount = …Run Code Online (Sandbox Code Playgroud)