在工程软件中会遇到在一张工程图纸或背景图中标注一些标志或者其他信息讲诉.docx
《在工程软件中会遇到在一张工程图纸或背景图中标注一些标志或者其他信息讲诉.docx》由会员分享,可在线阅读,更多相关《在工程软件中会遇到在一张工程图纸或背景图中标注一些标志或者其他信息讲诉.docx(9页珍藏版)》请在冰豆网上搜索。
在工程软件中会遇到在一张工程图纸或背景图中标注一些标志或者其他信息讲诉
在工程软件中会遇到在一张工程图纸或背景图中标注一些标志或者其他信息,
在静态图片中我们很方便可以使用文字或者其他小图标形式进行标注!
但也造成了所标注的点只能是静态显示而已,现在我们的需求是,一张背景图,上面有一些点需要标注,
这些点需要可以移动鼠标进入区域可以提示或高亮背景图分辨率变化时这些点能自动计算相对位置及大小使重叠在背景中
当然还有很多其他用处,如联动操作!
下面就已我实际中遇到的问题来做演示:
先看2张图进行一下对比
图一:
从这张图可以看出当鼠标移入此区域时会将此区域高亮并TollTip下(演示图做的有点粗糙大家见谅)
图二:
这张是鼠标移出后的图,大家可以看到几乎是完全重叠看不出(上图高亮区域为一个自定义控件),当然仔细看下其实重合的并不是完美,下面我会讲一个办法来做到看不出粗糙
OK,看完这2张演示草图后,我先来描述下如何实现这样的功能,其实也很简单
1:
在背景图需要显示的区域截图该区域图,要计算此截取区域相对与原图的top,left,windth,height比例
(注意需要计算出比例以便在程序中档背景图分辨率变量时根据比例重新计算区域图的大小及位置)
2:
将截取的区域图不需要高亮的部分处理为透明,这一步为下一步制作部规则自定义控件做准备
3:
制作一个区域图为背景的不规则自定义控件,
4,:
将自定义控件添加到显示原背景图的容器中;如下演示
剩下部分就是自定义控件根据背景进行位置及大小的计算了,先贴一部分用到的代码,
与制作不规则控件相关
public static Region InitCreate(Bitmap bitmap)
{
if (bitmap == null) //由窗口最小化引发自定义控件的背景图为null 控件大小为0
return null;
int height = bitmap.Height;
int width = bitmap.Width;
int xStart, xEnd;
GraphicsPath grpPath = new GraphicsPath();
for (int y = 0; y < height; y++)
{
//逐行扫描;
for (int x = 0; x < width; x++)
{
//略过连续透明的部分;
while (x < width && bitmap.GetPixel(x, y).A <= 10)
{
x++;
}
//不透明部分;
xStart = x;
while (x < width && bitmap.GetPixel(x, y).A > 10)
{
x++;
}
xEnd = x;
if (bitmap.GetPixel(x - 1, y).A >= 10)
{
grpPath.AddRectangle(new Rectangle(xStart, y, xEnd - xStart, 1));
}
}
}
return new Region(grpPath);
}
制作的不规则控件为了减少刷新,需要设置为双缓冲,
(但是不知道是双缓冲原因还是windows机制问题,窗体最小化时会致使自定义控件背景图为null大小为0,但窗口恢复后又正常,望知道的朋友不惜赐教)
图像缩放
///
/// Resize图片
///
/// 原始Bitmap
/// 新的宽度
/// 新的高度
/// 保留着,暂时未用
/// 处理以后的图片
public static Bitmap KiResizeImage(Bitmap bmp, int newW, int newH, int Mode)
{
try
{
Bitmap b = new Bitmap(newW, newH);
Graphics g = Graphics.FromImage(b);
// 插值算法的质量
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(bmp, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);
g.Dispose();
return b;
}
catch
{
return null;
}
}
图像亮度调整
///
/// 图像明暗调整
///
/// 原始图
/// 亮度[-255, 255]
///
public static Bitmap KiLighten(Bitmap b, int degree)
{
if (b == null)
{
return null;
}
if (degree < -255) degree = -255;
if (degree > 255) degree = 255;
try
{
int width = b.Width;
int height = b.Height;
int pix = 0;
Rectangle rect = new Rectangle(0, 0, width, height);
System.Drawing.Imaging.BitmapData bmpData =
b.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
PixelFormat.Format24bppRgb);
IntPtr ptr = bmpData.Scan0;
int bytes = bmpData.Stride * height;
byte[] rgbValues = new byte[bytes];
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
int offset = bmpData.Stride - width * 3;
int k = 0;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
//if (b.GetPixel(x, y) == Color.Transparent) //不处理透明部分
//continue;
// 处理指定位置像素的亮度
for (int i = 0; i < 3; i++)
{
pix = rgbValues[k + i] + degree;
if (degree < 0) rgbValues[k + i] = (byte)Math.Max(0, pix);
if (degree > 0) rgbValues[k + i] = (byte)Math.Min(255, pix);
}
k += 3;
}
k += offset;
}
System.Runtime.InteropServices.Marshal.Co