C#数字图像处理(三)

article/2025/6/22 7:25:48

文章目录

  • 前言
  • 1.图像平移
    • 1.1 图像平移定义
    • 1.2 图像平移编程实例
  • 2.图像镜像
    • 2.1 图像镜像定义
    • 2.2 图像镜像编程实例
  • 3.图像缩放
    • 3.1 图像缩放定义
    • 3.2 灰度插值法
    • 3.3 图像缩放编程实例
  • 4.图像旋转
    • 4.1 图像旋转定义
    • 4.2 图像旋转编程实例

前言

  在某种意义上来说,图像的几何运算是与点运算相对立的。它改变了像素之间的空间位置和空间关系,但它没有改变灰度等级值。几何运算需要两个独立的算法:空间变换灰度值插值
  在本章所介绍的几何运算中,应用空间变换算法对图像进行平移、镜像处理,应用空间变换和灰度值插值算法对图像进行缩放和旋转处理。
  需要说明的是,在这里,以图像的几何中心作为坐标原点,x轴由左向右递增,y轴由上至下递增。
  因此,在进行图像旋转时,是以图像的几何中心为基准进行旋转的:在进行图像缩放时,也是以图像的几何中心为基准,其上下左右均等地向内收缩或向外扩大的。这种坐标转换会使图像变换更自然。另外,在进行几何运算的时候,保持原图像的尺寸大小不变,如果变换后的图像超出该尺寸,超出部分会被截断,而不足部分会以白色像素填充。

1.图像平移

1.1 图像平移定义

在这里插入图片描述

1.2 图像平移编程实例

  该实例通过设置横向和纵向的平移量,实现了图像的平移。
在这里插入图片描述
  分别为该窗体内的2个Button控件添加Click事件,为了和主窗体之间传递数据,再添加2个get属性访问器,代码如下:

  public partial class translation : Form{public translation(){InitializeComponent();}private void start_Click(object sender, EventArgs e){this.DialogResult = DialogResult.OK;}private void close_Click(object sender, EventArgs e){this.Close();}public string GetXOffset{get{//横向平移量return xOffset.Text;}}public string GetYOffset{get{//纵向平移量return yOffset.Text;}}}

  回到主窗体,为“图像平移”按钮添加Click事件,代码如下:

 /// <summary>/// 图像平移/// </summary>private void translation_Click(object sender, EventArgs e){if (curBitmap!=null){translation traForm = new translation();if (traForm.ShowDialog()==DialogResult.OK){Rectangle rect = new Rectangle(0, 0, curBitmap.Width, curBitmap.Height);BitmapData bmpData = curBitmap.LockBits(rect, ImageLockMode.ReadWrite, curBitmap.PixelFormat);IntPtr ptr = bmpData.Scan0;int bytes = bmpData.Stride * bmpData.Height;byte[] grayValues = new byte[bytes];Marshal.Copy(ptr, grayValues, 0, bytes);//得到两个方向的图像平移量int x = Convert.ToInt32(traForm.GetXOFFset);int y = Convert.ToInt32(traForm.GetYOffset);byte[] tempArray = new byte[bytes];//临时初始化为白色(255)像素for (int i = 0; i < bytes; i++){tempArray[i] = 255;}for (int j = 0; j < curBitmap.Height; j++){//保证纵向平移不出界if ((j + y) < curBitmap.Height && (j + y) > 0){for (int i = 0; i < curBitmap.Width * 3; i += 3){if ((i + x * 3) < curBitmap.Width * 3 && (i + x * 3) > 0){//保证横向平移不出界tempArray[(i + x * 3) + 0 + (j + y) * bmpData.Stride] = grayValues[i + 0 + j * bmpData.Stride];tempArray[i + x * 3 + 1 + (j + y) * bmpData.Stride] = grayValues[i + 1 + j * bmpData.Stride];tempArray[i + x * 3 + 2 + (j + y) * bmpData.Stride] = grayValues[i + 2 + j * bmpData.Stride];}}}}//数组复制,返回平移图像grayValues = (byte[])tempArray.Clone();Marshal.Copy(grayValues, 0, ptr, bytes);curBitmap.UnlockBits(bmpData);}Invalidate();}

  要注意像素格式PixelFormat,如24位灰度图像是1440万色,但是我们书上给的算法是对8为进行处理,可以采用分割的思想将24位拆开成3个8位,由这三个8为所保存的数据组合为24位,在处理的时候就将他们分开处理但是要整体观看。

在这里插入图片描述

2.图像镜像

2.1 图像镜像定义

  镜像是一个物体相对于一个镜面的复制品。图像镜像分为水平镜像垂直镜像两种。
  水平镜像就是将图像左半部分和右半部分以图像垂直中轴线为中心镜像进行对换;
   垂直镜像就是将图像上半部分和下半部分以图像水平中轴线为中心镜像进行对换。
在这里插入图片描述

2.2 图像镜像编程实例

该实例实现了图像的水平镜像和垂直镜像。
在这里插入图片描述
  分别为该窗体内的2个Button控件添加Click事件,并再添加1个get属性访问器,代码如下:

    private void startMirror_Click(object sender, EventArgs e){this.DialogResult = DialogResult.OK;}private void close_Click(object sender, EventArgs e){this.Close();}public bool GetMirror{get{return horMirror.Checked;}}
}

  回到主窗体,为“图像镜像”按钮添加Click事件,代码如下:

private void mirror_Click(object sender, EventArgs e){if (curBitmap!=null){mirror mirForm = new mirror();if (mirForm.ShowDialog()==DialogResult.OK){Rectangle rect = new Rectangle(0, 0, curBitmap.Width, curBitmap.Height);BitmapData bmpData = curBitmap.LockBits(rect, ImageLockMode.ReadWrite, curBitmap.PixelFormat);IntPtr ptr = bmpData.Scan0;int bytes = 0;判断是灰度色图像还是彩色图像,给相应的大小if (curBitmap.PixelFormat==PixelFormat.Format8bppIndexed){bytes= curBitmap.Width * curBitmap.Height;}else if (curBitmap.PixelFormat == PixelFormat.Format24bppRgb){bytes = curBitmap.Width * curBitmap.Height * 3;}byte[] pixelValues = new byte[bytes];Marshal.Copy(ptr, pixelValues, 0, bytes);//水平中轴int halfWidth = curBitmap.Width / 2;//垂直中轴int halfHeight = curBitmap.Height / 2;byte temp;byte temp1;byte temp2;byte temp3;if (curBitmap.PixelFormat == PixelFormat.Format8bppIndexed){if (mirForm.GetMirror){for (int i = 0; i < curBitmap.Height; i++)for (int j = 0; j < halfWidth; j++){temp = pixelValues[i * curBitmap.Width + j];pixelValues[i * curBitmap.Width + j] = pixelValues[(i + 1) * curBitmap.Width - j - 1];pixelValues[(i + 1) * curBitmap.Width - j - 1] = temp;}}else{for (int j = 0; j < curBitmap.Width; j++){for (int i = 0; i < halfHeight; i++){temp = pixelValues[i * curBitmap.Width + j];pixelValues[i * curBitmap.Width + j] = pixelValues[(curBitmap.Height - i - 1) * curBitmap.Width + j];pixelValues[(curBitmap.Height - i - 1) * curBitmap.Width + j] = temp;}}}}else if (curBitmap.PixelFormat == PixelFormat.Format24bppRgb){if (mirForm.GetMirror){//水平镜像处理  for (int i = 0; i < curBitmap.Height; i++){//每个像素的三个字节在水平镜像时顺序不能变,所以这个方法不能用//for (int j = 0; j < halfWidth; j++)//{//    //以水平中轴线为对称轴,两边像素值交换  //    temp = pixelValues[i * curBitmap.Width * 3 + j * 3];//    pixelValues[i * curBitmap.Width * 3 + j * 3] = pixelValues[(i + 1) * curBitmap.Width * 3 - 1 - j * 3];//    pixelValues[(i + 1) * curBitmap.Width * 3 - 1 - j * 3] = temp;//}for (int j = 0; j < halfWidth; j++){//每三个字节组成一个像素,顺序不能乱temp = pixelValues[0 + i * curBitmap.Width * 3 + j * 3];temp1 = pixelValues[1 + i * curBitmap.Width * 3 + j * 3];temp2 = pixelValues[2 + i * curBitmap.Width * 3 + j * 3];pixelValues[0 + i * curBitmap.Width * 3 + j * 3] = pixelValues[0 + (i + 1) * curBitmap.Width * 3 - (j + 1) * 3];pixelValues[1 + i * curBitmap.Width * 3 + j * 3] = pixelValues[1 + (i + 1) * curBitmap.Width * 3 - (j + 1) * 3];pixelValues[2 + i * curBitmap.Width * 3 + j * 3] = pixelValues[2 + (i + 1) * curBitmap.Width * 3 - (j + 1) * 3];pixelValues[0 + (i + 1) * curBitmap.Width * 3 - (j + 1) * 3] = temp;pixelValues[1 + (i + 1) * curBitmap.Width * 3 - (j + 1) * 3] = temp1;pixelValues[2 + (i + 1) * curBitmap.Width * 3 - (j + 1) * 3] = temp2;}}}else{//垂直镜像处理  for (int i = 0; i < curBitmap.Width * 3; i++){for (int j = 0; j < halfHeight; j++){//以垂直中轴线为对称轴。两边像素值互换  temp = pixelValues[j * curBitmap.Width * 3 + i];pixelValues[j * curBitmap.Width * 3 + i] = pixelValues[(curBitmap.Height - j - 1) * curBitmap.Width * 3 + i];pixelValues[(curBitmap.Height - j - 1) * curBitmap.Width * 3 + i] = temp;}}}}Marshal.Copy(pixelValues, 0, ptr, bytes);curBitmap.UnlockBits(bmpData);}Invalidate();}}
原图

在这里插入图片描述

水平镜像

在这里插入图片描述

垂直镜像

在这里插入图片描述

3.图像缩放

  在图像缩放运算和图像旋转运算中,要用到灰度插值算法,因此这里给出灰度插值的两种算法。

3.1 图像缩放定义

在这里插入图片描述

3.2 灰度插值法

  应用公式(4.5)所产生的图像中的像素有可能在原图像中找不到相应的像素点,因为数字图像中的坐标总是整数。这样就必须进行近似处理。一般是应用灰度插值法。它包括最近邻插值双线性插值
  最近邻插值也称零阶插值,是最简单的插值方法。其做法是令输出像素的灰度值等于离它所映射到的位置最近的输入像素的灰度值。该插值计算虽然十分简单,但它会带来锯齿形的边,图像中也会出现孔洞和重叠。
  双线性插值也称一阶插值,该方法是求到相邻的4个方格上点的距离之比,用这个比率和4个邻点像素的灰度值进行灰度插值,具体方法如下。
在这里插入图片描述
  双线性插值法计算量大,但缩放后图像质量高,不会出现像素值不连续的情况。由于双线性插值具有低通滤波器的性质,使高频分量受损,所以可能会使图像轮廓在一定程度上变得模糊。

3.3 图像缩放编程实例

  该实例应用最近邻插值法和双线性插值法实现图像的缩放。
  在主窗体内添加1个Button控件,其属性修改如表4.5所示。
在这里插入图片描述
   创建1个名为zoom 的 Windows窗体,该窗体用于选择缩放量及用何种灰度插值法。为该窗体添加2个Button控件、1个GroupBox控件、2个RadioButton 控件、2个Label 控件和2个TextBox控件,其属性修改如表4.6所示。
在这里插入图片描述
  分别为该窗体内的2个Button控件添加Click事件,并再添加3个get属性访问器,代码如下:

   private void startZoom_Click(object sender, EventArgs e){if (xZoom.Text == "0" || yZoom.Text == "0"){MessageBox.Show("缩放量不能为0!\n请重新正确填写。", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);}else{this.DialogResult = DialogResult.OK;}}private void close_Click(object sender, EventArgs e){this.Close();}public bool GetNearOrBil{get{//判断是最近邻插值法还是双线性插值法return nearestNeigh.Checked;}}public string GetXZoom{get{//得到横向缩放量return xZoom.Text;}}public string GetYZoom{get{//得到纵向缩放量return yZoom.Text;}}

  回到主窗体,为“图像缩放”按钮控件添加Click事件代码,代码如下:

   private void zoom_Click(object sender, EventArgs e){if (curBitmap != null){zoom zoomForm = new zoom();if (zoomForm.ShowDialog() == DialogResult.OK){Rectangle rect = new Rectangle(0, 0, curBitmap.Width, curBitmap.Height);System.Drawing.Imaging.BitmapData bmpData = curBitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, curBitmap.PixelFormat);IntPtr ptr = bmpData.Scan0;int bytes = curBitmap.Width * curBitmap.Height;byte[] grayValues = new byte[bytes];System.Runtime.InteropServices.Marshal.Copy(ptr, grayValues, 0, bytes);double x = Convert.ToDouble(zoomForm.GetXZoom);double y = Convert.ToDouble(zoomForm.GetYZoom);int halfWidth = (int)(curBitmap.Width / 2);int halfHeight = (int)(curBitmap.Height / 2);int xz = 0;int yz = 0;int tempWidth = 0;int tempHeight = 0;byte[] tempArray = new byte[bytes];if (zoomForm.GetNearOrBil == true){for (int i = 0; i < curBitmap.Height; i++){for (int j = 0; j < curBitmap.Width; j++){tempHeight = i - halfHeight;tempWidth = j - halfWidth;if (tempWidth > 0){xz = (int)(tempWidth / x + 0.5);}else{xz = (int)(tempWidth / x - 0.5);}if (tempHeight > 0){yz = (int)(tempHeight / y + 0.5);}else{yz = (int)(tempHeight / y - 0.5);}tempWidth = xz + halfWidth;tempHeight = yz + halfHeight;if (tempWidth < 0 || tempWidth >= curBitmap.Width || tempHeight < 0 || tempHeight >= curBitmap.Height){tempArray[i * curBitmap.Width + j] = 255;}else{tempArray[i * curBitmap.Width + j] = grayValues[tempHeight * curBitmap.Width + tempWidth];}}}}else{double tempX, tempY, p, q;for (int i = 0; i < curBitmap.Height; i++){for (int j = 0; j < curBitmap.Width; j++){tempHeight = i - halfHeight;tempWidth = j - halfWidth;tempX = tempWidth / x;tempY = tempHeight / y;if (tempWidth > 0){xz = (int)tempX;}else{xz = (int)(tempX - 1);}if (tempHeight > 0){yz = (int)tempY;}else{yz = (int)(tempY - 1);}p = tempX - xz;q = tempY - yz;tempWidth = xz + halfWidth;tempHeight = yz + halfHeight;if (tempWidth < 0 || (tempWidth + 1) >= curBitmap.Width || tempHeight < 0 || (tempHeight + 1) >= curBitmap.Height){tempArray[i * curBitmap.Width + j] = 255;}else{tempArray[i * curBitmap.Width + j] = (byte)((1.0 - q) * ((1.0 - p) * grayValues[tempHeight * curBitmap.Width + tempWidth] + p * grayValues[tempHeight * curBitmap.Width + tempWidth + 1]) + q * ((1.0 - p) * grayValues[(tempHeight + 1) * curBitmap.Width + tempWidth] + p * grayValues[(tempHeight + 1) * curBitmap.Width + 1 + tempWidth]));}}}}grayValues = (byte[])tempArray.Clone();System.Runtime.InteropServices.Marshal.Copy(grayValues, 0, ptr, bytes);curBitmap.UnlockBits(bmpData);}Invalidate();}}

在这里插入图片描述
在这里插入图片描述

最近邻插值放大5倍

在这里插入图片描述

双线性插值放大5倍

在这里插入图片描述

4.图像旋转

4.1 图像旋转定义

在这里插入图片描述
  同理,旋转后得到的图像像素也有可能在原图像中找不到相应的像素点,因此旋转处理也要用到插值法。由于双线性插值法在图像处理性能上要好过最近邻插值,因此,我们只应用双线性插值这一种方法对图像进行旋转处理。

4.2 图像旋转编程实例

  该实例实现了任意角度的图像旋转。
  1).在主窗体内添加1个Button 控件,其属性修改如表4.7所示。
在这里插入图片描述
  2).创建1个名为rotation的 Windows窗体,该窗体用于选择旋转的角度。为该窗体添加2个Button控件、1个Label控件和1个TextBox控件,其属性修改如表4.8所示。
在这里插入图片描述
在这里插入图片描述
  分别为该窗体内的2个Button控件添加Cick事件,并再添加1个get属性访问器,代码如下:

  private void startRot_Click(object sender, EventArgs e){this.DialogResult = DialogResult.OK;}private void close_Click(object sender, EventArgs e){this.Close();}public string GetDegree{get{//得到所要旋转的角度return degree.Text;}}

  回到主窗体,为“图像旋转”按钮控件添加Click事件,代码如下:

  private void rotation_Click(object sender, EventArgs e){if (curBitmap != null){rotation rotForm = new rotation();if (rotForm.ShowDialog() == DialogResult.OK){Rectangle rect = new Rectangle(0, 0, curBitmap.Width, curBitmap.Height);System.Drawing.Imaging.BitmapData bmpData = curBitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, curBitmap.PixelFormat);IntPtr ptr = bmpData.Scan0;int bytes = curBitmap.Width * curBitmap.Height;byte[] grayValues = new byte[bytes];System.Runtime.InteropServices.Marshal.Copy(ptr, grayValues, 0, bytes);int degree = Convert.ToInt32(rotForm.GetDegree);double radian = degree * Math.PI / 180.0;double mySin = Math.Sin(radian);double myCos = Math.Cos(radian);int halfWidth = (int)(curBitmap.Width / 2);int halfHeight = (int)(curBitmap.Height / 2);int xr = 0;int yr = 0;int tempWidth = 0;int tempHeight = 0;byte[] tempArray = new byte[bytes];double tempX, tempY, p, q;for (int i = 0; i < curBitmap.Height; i++){for (int j = 0; j < curBitmap.Width; j++){tempHeight = i - halfHeight;tempWidth = j - halfWidth;tempX = tempWidth * myCos - tempHeight * mySin;tempY = tempHeight * myCos + tempWidth * mySin;if (tempWidth > 0){xr = (int)tempX;}else{xr = (int)(tempX - 1);}if (tempHeight > 0){yr = (int)tempY;}else{yr = (int)(tempY - 1);}p = tempX - xr;q = tempY - yr;tempWidth = xr + halfWidth;tempHeight = yr + halfHeight;if (tempWidth < 0 || (tempWidth + 1) >= curBitmap.Width || tempHeight < 0 || (tempHeight + 1) >= curBitmap.Height){tempArray[i * curBitmap.Width + j] = 255;}else{tempArray[i * curBitmap.Width + j] = (byte)((1.0 - q) * ((1.0 - p) * grayValues[tempHeight * curBitmap.Width + tempWidth] + p * grayValues[tempHeight * curBitmap.Width + tempWidth + 1]) +q * ((1.0 - p) * grayValues[(tempHeight + 1) * curBitmap.Width + tempWidth] + p * grayValues[(tempHeight + 1) * curBitmap.Width + 1 + tempWidth]));}}}grayValues = (byte[])tempArray.Clone();System.Runtime.InteropServices.Marshal.Copy(grayValues, 0, ptr, bytes);curBitmap.UnlockBits(bmpData);}Invalidate();}}

在这里插入图片描述
在这里插入图片描述


http://www.hkcw.cn/article/bSLtFdZOnI.shtml

相关文章

一个「体虚」的人,手和脸上都有迹象

传统医学理论将“虚”分为阴虚、阳虚、气虚、血虚。其中,血虚是因为体内血不足,气虚则是气不足,阴虚与阳虚是人体脏腑阴阳平衡被打破而产生的证候。《生命时报》综合多位专家观点,详解不同体虚的特点,并给出调理方案。不同体虚,怎么分辨?中国中医科学院西苑医院脑病科副…

莫雷加德谈与樊振东成队友 超级期待他的加入

当地时间6月1日,樊振东即将加盟的德国萨尔布吕肯乒乓球俱乐部在欧洲乒乓球冠军联赛男团决赛中第三次夺得欧冠冠军。队中的瑞典选手莫雷加德凭借稳定发挥获评赛事MVP。欧洲乒联发布了莫雷加德赛后采访,他连用三个“really”表达对樊振东加盟的期待,并表示能和樊振东做队友非常…

杨幂酱园弄王许梅造型 举手投足间故事感十足

杨幂酱园弄王许梅造型,一个眼神带着悲悯、坚毅、不屈,举手投足间故事感十足,巨期待杨幂塑造的王许梅了!责任编辑:zx0002

高阶数据结构——并查集

1.并查集原理 在一些应用问题中&#xff0c;需要将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合&#xff0c;然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问…

价值约4万欧元的马克龙蜡像被盗 环保人士抗议行动

当地时间6月2日,三名自称是游客的抗议者进入法国格雷万蜡像馆,盗走了法国总统马克龙的蜡像,并通过应急出口离开。该蜡像价值4万欧元。这三人实际上是环保人士,包括两名女子和一名男子。他们假扮游客进入蜡像馆后更换衣服冒充工作人员,用毯子包裹蜡像并通过紧急出口带出,将…

好消息连放8天坏消息4个月后 下轮假期待国庆中秋

今天是端午节假期的最后一天,大家可能已经在期待下一次休假了。根据国务院办公厅关于2025年部分节假日安排的通知,接下来的假期将在四个月后的国庆节和中秋节。这两个节日合并放假,总共将有八天的假期。责任编辑:zhangxiaohua

滕州男童家门口走失 家属急寻线索

6月1日,有网友发布视频称山东省滕州市姜屯镇黄坡村一名10岁男孩赵某超走失。孩子家属非常焦急,希望通过网络社交媒体寻求帮助。当天下午,赵某超的外公王先生表示,通过查看家门口的监控发现,孩子是5月31日下午5时左右走失的。当时孩子在家门口的监控中消失了几分钟后又返回…

苏敏走完戛纳红毯回国房车被淹了 人生重启的勇气

苏敏走完戛纳红毯回国房车被淹了 人生重启的勇气!2024年5月,法国戛纳电影节红毯上出现了一个让全场意外的身影。一位61岁的中国阿姨面对闪光灯笑得舒展又笃定。她穿着苏绣旗袍,头发利落地盘起,自信从容。当主持人介绍这是电影《出走的决心》原型苏敏时,现场响起一片惊呼。…

巴黎世家平角短裤造型裙子4500一条 时尚界的另类创新

巴黎世家平角短裤造型裙子4500一条!近日,巴黎世家推出的一款女款半身裙引发热议。不少网友认为这款裙子造型与平角短裤相似,纷纷吐槽“看不懂时尚”。据巴黎世家官网介绍,这款深蓝色弹力平纹针织半身裙亮相于2025秋季系列,采用弹力棉混纺平纹针织面料,设计为平角短裤造型…

当地回应松原一地出现龙卷风:受灾情况正在统计

网传吉林松原出现龙卷风,目击者拍摄到震撼画面镇政府:受灾情况正在统计。责任编辑:zx0002

【Kubernetes-1.30】--containerd部署

文章目录 一、环境准备1.1 三台服务器1.2 基础配置&#xff08;三台机通用&#xff09;1.3 关闭 Swap&#xff08;必须&#xff09;1.4 关闭防火墙&#xff08;可选&#xff09;1.5 加载必要模块 & 配置内核参数 二、安装容器运行时&#xff08;containerd 推荐&#xff09…

RGB888色彩格式转RGB565格式

一个RGB888格式的色彩值是三字节&#xff0c;有24个bit 一个RGB565格式的色彩值是双字节&#xff0c;有16个bit 将R值的高5位取出&#xff0c;G值的高6位去除&#xff0c;B值的高5位取出&#xff0c;按从高到低的顺序码放在一起后就是RGB565色彩值了 R (RGB888 & 0xF800…

java28

1.IO流续集 字节流和字符流的使用场景&#xff1a; 综合练习&#xff1a; 拷贝文件夹&#xff1a; 文件加密&#xff1a; 一个数字异或两次某个数字就会得到自己本身 修改文件中的数据&#xff1a; 改进&#xff1a; &#xff0c;bom头占3个字节 查看IDEA里面保存的文件是否…

【笔记】MinGW-w64 环境下安装 meson 工具链

&#x1f4dd; MinGW-w64 环境下安装 meson 工具链的安装笔记 ✅ 安装目标 在 MSYS2 MinGW-w64 x86_64 环境中&#xff0c;使用 pacman 安装构建工具 meson 及其依赖。 &#x1f9f0; 安装命令 pacman -S meson &#x1f4e6; 安装内容概览 包名版本描述pkgconf2.4.3-1提供…

vulnyx lower5 writeup

信息搜集 arp-scan 目标IP为&#xff1a;192.168.43.177 nmap 发现开放了22和80端口 获取userFlag 有web服务&#xff0c;就先上去看一看 点击about后发现url变成了&#xff1a; http://192.168.43.177/page.php?incabout.html 这里很明显的就是一个利用点&#xff0c;根据…

哪吒汽车违反劳动保障条例被罚 拒不改正遭处罚

合众新能源汽车股份有限公司,即哪吒汽车关联公司,于5月23日新增两条行政处罚信息,处罚总金额为3.3万元,均由桐乡市人力资源和社会保障局执行。文书号分别为“桐人社罚决字 [2025] 第 000070 号”和“桐人社罚决字 [2025] 第 000071 号”。处罚事由显示,该公司在2025年3月2…

美国经济突传利空,美元指数直线跳水!美国财长最新发声 市场波动加剧

美国经济近期出现不利信号。美股三大指数盘初集体跳水,道指一度跌超1%。根据ISM公布的数据,美国5月ISM制造业活动连续四个月萎缩,进口分项指标创十六年新低。美媒分析认为,这反映了特朗普关税政策反复调整带来的广泛不确定性。受此影响,美元指数直线跳水,跌幅达0.8%,美元…

台积电2nm良率已达90% 市场需求强劲

台积电的2nm芯片制造工艺良率已超过90%,显示出其在先进技术方面的领先地位。在美国亚利利桑那州,台积电的工厂产能接近满负荷运行,订单源源不断,主要客户包括苹果、英伟达、高通、AMD和博通等美国科技巨头。台积电收到的2nm工艺芯片设计数量是5nm工艺的四倍,表明市场对2nm…

中国小电驴打破各国美梦 钠电池领先全球

中国在全球锂电池领域占据主导地位,一些国家试图减少对华依赖。分析人士认为,钠离子电池可能是其他国家减少对中国电池依赖的一条捷径,但数据显示,中国将在该领域再次领先世界。BBC注意到,通过电动两轮车(“小电驴”),钠电池已经在中国市场广泛应用。在杭州,数十辆造型…

家有两栋楼招亲男子辟谣 澄清加好友误解

家有两栋楼招亲男子辟谣 澄清加好友误解!5月31日,天河猎德村迎来一年一度的龙舟招景盛会,广州各地超过150条村前来猎德涌趁景。其中,一条龙舟上的“征婚启事”引起了广泛关注。视频中,一名男子脖子上挂着一张写有“两栋楼,海珠,未婚”的牌子。同日,该男子在社交平台上开…