首页 > 其他分享 >GDI++绘图问题

GDI++绘图问题

时间:2024-04-24 13:23:33浏览次数:13  
标签:targetSize ++ pbx Height Width 绘图 new GDI originalSize

截图--控件截图

//control.CopyFromScreen
    //ok  
    //Rectangle rectangleBounds = pbx.Bounds;
    //Bitmap bit = new Bitmap(rectangleBounds.Width, rectangleBounds.Height);//实例化一个和窗体一样大的bitmap
    //Graphics g = Graphics.FromImage(bit);
    //g.CompositingQuality = CompositingQuality.HighQuality;//质量设为最高
    ////g.CopyFromScreen(pbx.Left, pbx.Top, 0, 0, new Size(pbx.Width, pbx.Height));//保存整个窗体为图片
    //g.CopyFromScreen(pbx.PointToScreen(Point.Empty), Point.Empty, pbx.Size);//保存整个窗体为图片
    ////g.CopyFromScreen(panel游戏区 .PointToScreen(Point.Empty), Point.Empty, panel游戏区.Size);//只保存某个控件(这里是panel游戏区)
    //bit.Save("签名.png");//默认保存格式为PNG,保存成jpg格式质量不是很好

    //////保存dataGridView1截图
    //Bitmap newbitmap = new Bitmap(pbx.Width, pbx.Height);
    //pbx.DrawToBitmap(newbitmap, new Rectangle(0, 0, newbitmap.Width, newbitmap.Height));
    //newbitmap.Save("签名pbx.DrawToBitmap.png"); 

 

读取指纹文件图片,加载在picturebox中
/// <summary>
  /// 创建画布的画板背景
  /// </summary>
  Bitmap backgroundImage = null;
  
  //this.pbx.BackgroundImage = System.Drawing.Image.FromFile(tempPath);
  using (FileStream ms = File.OpenRead(tempPath))
  {
      //File.WriteAllBytes("Fingerprint222.bmp", File.ReadAllBytes("11.png"));
      //File.WriteAllBytes("Fingerprint.bmp", imageBufFingerprint);

      //解决内存异常问题,以及this.pbx.BackgroundImage = System.Drawing.Image.FromStream(ms)导致的一般性gdi+ 问题
      using (Bitmap bt = new Bitmap(ms))
      {
          backgroundImage = new Bitmap(bt.Width, bt.Height);
          //Graphics g = pbx.CreateGraphics();
          Graphics g = Graphics.FromImage(backgroundImage);
          //g.DrawLine(Pens.Black, startPoint, e.Location);
          //g.Clear(Color.White);
          //Pen myPen = new Pen(Color.Black, int.TryParse(ConfigurationManager.AppSettings["penwidth"], out int penwidth) ? penwidth : 3);
          g.SmoothingMode = SmoothingMode.AntiAlias;
          g.CompositingQuality = CompositingQuality.HighQuality;
          g.CompositingMode = CompositingMode.SourceOver;
          g.DrawImage(bt, bt.Width, bt.Height);
          //PointF pointFstart = PointToPointF(startPoint);
          //PointF pointFend = PointToPointF(e.Location);
          //g.DrawBeziers(myPen, new PointF[] { pointFstart, pointFend });
          pbx.BackgroundImage = backgroundImage;
          g.Dispose();

          //bt.Save("Fingerprint.jpg");
          //this.pbx.BackgroundImage = System.Drawing.Image.FromStream(ms);
      }
  }
  //解决提示内存异常错误
  GC.Collect();

 

bmp转png 设置透明度
var  imagezzRaw2Bmp=System.IO.File.ReadAllBytes("Fingerprint.bmp");
    using (Bitmap bitmap = new Bitmap(new MemoryStream(imagezzRaw2Bmp)))
    //using (Bitmap bitmap = new Bitmap("Fingerprint.bmp"))
    {
        //bitmap.MakeTransparent(Color.FromArgb(0, Color.Transparent));
        bitmap.MakeTransparent(Color.FromArgb(0, Color.White));//设置指定颜色为透明。白色
        bitmap.Save("Fingerprint.png");
        //var bitmap1 = Untils.GeneralConvert(bitmap, Color.Blue);
        //bitmap1.Save(@"01.png");
    }

 

bmp图片缩放问题
/// <summary>
/// 缩小比例
/// </summary>
/// <param name="originalSize"></param>
/// <param name="targetSize"></param>
/// <returns></returns>
public static Size CalculateNewSize(Size originalSize, Size targetSize)
{
    int newWidth, newHeight;
    // 如果原始宽度大于目标宽度,则按宽度比例缩放
    if (originalSize.Width > targetSize.Width)
    {
        newWidth = targetSize.Width;
        newHeight = (int)(((float)originalSize.Height) * (float)((float)targetSize.Width / (float)originalSize.Width));
    }
    // 如果原始高度大于目标高度,则按高度比例缩放
    else if (originalSize.Height > targetSize.Height)
    {
        newHeight = targetSize.Height;
        newWidth = originalSize.Width * targetSize.Height / originalSize.Height;
    }
    // 如果原始尺寸小于或等于目标尺寸,则不需要缩放
    else
    {
        newWidth = originalSize.Width;
        newHeight = originalSize.Height;
    }

    return new Size(newWidth, newHeight);
}

/// <summary>
/// 放大缩小
/// </summary>
/// <param name="originalSize"></param>
/// <param name="targetSize"></param>
/// <param name="isScale"></param>
/// <returns></returns>
public static Size CalculateSize(Size originalSize, Size targetSize, bool isScale = true)
{
    int newWidth, newHeight;
    if (isScale)
    {
        // 如果原始宽度大于目标宽度,则按宽度比例缩放
        if (originalSize.Width > targetSize.Width)
        {
            newWidth = targetSize.Width;
            newHeight = originalSize.Height * targetSize.Width / originalSize.Width;
        }
        // 如果原始高度大于目标高度,则按高度比例缩放
        else if (originalSize.Height > targetSize.Height)
        {
            newHeight = targetSize.Height;
            newWidth = originalSize.Width * targetSize.Height / originalSize.Height;
        }
        // 如果原始尺寸小于或等于目标尺寸,则不需要缩放
        else
        {
            newWidth = originalSize.Width;
            newHeight = originalSize.Height;
        }
    }
    else
    {
        // 如果原始宽度大于目标宽度,则按宽度比例放大
        if (originalSize.Width < targetSize.Width)
        {
            newWidth = targetSize.Width;
            newHeight = targetSize.Height * targetSize.Width / originalSize.Width;
        }
        // 如果原始高度大于目标高度,则按高度比例缩放
        else if (originalSize.Height < targetSize.Height)
        {
            newHeight = targetSize.Height;
            newWidth = originalSize.Width * targetSize.Height / originalSize.Height;
        }
        // 如果原始尺寸小于或等于目标尺寸,则不需要缩放
        else
        {
            newWidth = originalSize.Width;
            newHeight = originalSize.Height;
        }
    }
    return new Size(newWidth, newHeight);
}


调用
  //缩小保存
  int signWidth = int.TryParse(ConfigurationManager.AppSettings["fingerprintWidth"], out int signwidth) ? signwidth : 25;
  int signHeight = int.TryParse(ConfigurationManager.AppSettings["fingerprintHeight"], out int signheight) ? signheight : 36;

  // 计算等比缩放后的尺寸
  Size newSize = Untils.CalculateNewSize(pbxFingerprint.Image.Size, new Size(signWidth, signHeight));

  using (Bitmap resizedImage = new Bitmap(pbxFingerprint.Image, newSize))
  {

      // 获取PNG图像编码器
      ImageCodecInfo imageCodecInfo = Untils.GetEncoderInfo("image/png"); //ImageCodecInfo.GetImageEncoders().Where(a=>a.MimeType== "image/png").First();
      // 设置PNG图像编码参数
      EncoderParameters encoderParameters = new EncoderParameters(1);
      EncoderParameter encoderParameter = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L); // 设置质量为100%
      encoderParameters.Param[0] = encoderParameter;

      // 保存Bitmap为PNG格式
      //bitmap.MakeTransparent(Color.FromArgb(0, Color.Transparent));
      resizedImage.MakeTransparent(Color.FromArgb(0, Color.White));//设置指定颜色为透明。白色
      resizedImage.Save(tempLocalFingerPrintPath, imageCodecInfo, encoderParameters);
  }

 

 

标签:targetSize,++,pbx,Height,Width,绘图,new,GDI,originalSize
From: https://www.cnblogs.com/1175429393wljblog/p/18155072

相关文章

  • C++ 指针变量的字面量以及其所指对象的字面量
    指针变量的字面量以及其所指对象的字面量 #include<iostream>usingnamespacestd;intmain(){intvar=20;int*var_address;var_address=&var;cout<<"Valueofvarvariavle:"<<var<<endl;//Valueofvarvari......
  • C++ 指针变量的字面量以及其所指对象的字面量
    指针变量的字面量以及其所指对象的字面量 #include<iostream>usingnamespacestd;intmain(){intvar=20;int*var_address;var_address=&var;cout<<"Valueofvarvariavle:"<<var<<endl;//Valueofvarvari......
  • c++
     如何验证gcc正常使用,编译c以及运行过程要验证GCC(GNUCompilerCollection)是否正常使用,您可以按照以下步骤进行操作:检查GCC是否安装:打开终端或命令行界面,输入以下命令来检查GCC是否已安装:gcc--version 如果GCC已正确安装,您将看到GCC的版本信息。如果没有安装,您......
  • C++ 指针变量的字面量以及其所指对象的字面量
    指针变量的字面量以及其所指对象的字面量 #include<iostream>usingnamespacestd;intmain(){intvar=20;int*var_address;var_address=&var;cout<<"Valueofvarvariavle:"<<var<<endl;//Valueofvarvari......
  • 为什么自动驾驶领域发论文都是用强化学习算法,但是实际公司里却没有一家使用强化学习算
    为什么自动驾驶领域发论文都是用强化学习算法,但是实际公司里却没有一家使用强化学习算法?——(特斯拉今年年初宣布推出实际上第一款纯端到端的自动驾驶系统,全部使用强化算法,替换掉原有的30万行C++的rule-based代码)给出一个自己比较认可的答案:https://www.zhihu.com/question/54......
  • C++ 指针变量的字面量以及其所指对象的字面量
     指针变量的字面量以及其所指对象的字面量 #include<iostream>usingnamespacestd;intmain(){intvar=20;int*var_address;var_address=&var;cout<<"Valueofvarvariavle:"<<var<<endl;//Valueofvarv......
  • 深度解读《深度探索C++对象模型》之C++虚函数实现分析(二)
    接下来我将持续更新“深度解读《深度探索C++对象模型》”系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,自动获得推文和全部的文章列表。第一篇请从这里阅读:深度解读《深度探索C++对象模型》之C++虚函数实现分析(一)这一篇主要讲解多重继承情况下的虚函数实现分析。在多重......
  • 将C++代码文件路径、行号、函数名称等打包到#pragma message输出的方法
    #include<iostream>#define__GEN_STRING_IMPL(x)#x#define__GEN_STRING(x)__GEN_STRING_IMPL(x)#define__GEN_LOCATION_STRING()__FILE__"("__GEN_STRING(__LINE__)"):"classCTestObject{public:voidprint1(){......
  • C++ Vector fundamental
    C++Vectorfundamental主要内容包括:引入头文件,如何创建并初始化,访问容量,增查删改;1.包含头文件#include<vector>#include<iostream>2.创建vectorvector<int>v;vector<char>v1;vector<string>v2;3.初始化一维vector初始化后不进行赋值,直接访问会报错;3.1ve......
  • C++ 访问说明符详解:封装数据,控制访问,提升安全性
    C++访问说明符访问说明符是C++中控制类成员(属性和方法)可访问性的关键字。它们用于封装类数据并保护其免受意外修改或滥用。三种访问说明符:public:允许从类外部的任何地方访问成员。private:仅允许在类内部访问成员。protected:允许在类内部及其派生类中访问成员。示例:cla......