请教一下 c# 怎么实现图像的转置呀

咸鱼要努力 2021-05-05 03:53:45
各位大佬好,原图用bitmap类储存读取数值,这样就不能改变宽和高。 但按照原图信息重新生成新图,我生成不出来,也没有查到类似操作。
...全文
180 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
desperaso 2021-05-06
  • 打赏
  • 举报
回复
引用 6 楼 懒咸鱼要努力 的回复:
谢谢,我看一下这个
那个例子不是3D旋转什么的,本质上是通过4个点坐标来变形处理每一副图像的形状。 通过立方体6个面变化的坐标值,来绘制6副图像变形。
兔子-顾问 2021-05-06
  • 打赏
  • 举报
回复
分享给你一个例子 https://download.csdn.net/download/wuyazhe/2090762 包含了GDI+图形操作的你能想到的内容,各种滤镜,转置,镜像,图像变换,一应俱全。
desperaso 2021-05-06
  • 打赏
  • 举报
回复
http://bbs.cskin.net/thread-15494-1-1.html
winform的效果图,多图像随角度变化进行变形处理
咸鱼要努力 2021-05-06
  • 打赏
  • 举报
回复
引用 5 楼 兔子党-顾问的回复:
分享给你一个例子 https://download.csdn.net/download/wuyazhe/2090762 包含了GDI+图形操作的你能想到的内容,各种滤镜,转置,镜像,图像变换,一应俱全。
// 文件名
private string IFileName;

// 图像对象
private Bitmap Ibmp; // 打开图像 private void OpenToolStripMenuItem_Click(object sender, EventArgs e) { // 实例化文件打开对话框 OpenFileDialog opnDlg = new OpenFileDialog(); // 为图像选择一个筛选器 opnDlg.Filter = "所有图像文件 | *.bmp; *.png; *.pcx; *.jpg; *.gif;" + "*.tif; *.ico; *.dxf; *.cgm; *.cdr; *.wmf; *.emg|" + "位图( *.bmp; *.jpg; *.png;...) | *bmp; *.pcx; *.png; *.gif; *jpg; *.tif; *.ico|" + "矢量图( *wmf; *.eps; *.emf;...) | *.dxf; *.cgm; *.cdr; *.wmf; *.eps; *.emf"; // 设置对话框标题 opnDlg.Title = "打开图像文件"; // 启用“帮助”按钮 opnDlg.ShowHelp = true; // 如果结果为“打开”,选定文件 if (opnDlg.ShowDialog() == DialogResult.OK) { //选取当前选中的文件名 IFileName = opnDlg.FileName; try { Ibmp = (Bitmap)Image.FromFile(IFileName); } catch (Exception exp) { // 抛出异常 MessageBox.Show(exp.Message); } } Invalidate(); } // 绘制图像
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e. Graphics;
if (Ibmp != null)
{
g.DrawImage(Ibmp, 50, 50, Ibmp.Width, Ibmp.Height);
g.Dispose();
}
} // 图像转置 private void Transposition_Click(object sender, EventArgs e) { if (Ibmp != null) { Rectangle rect = new Rectangle(0, 0, Ibmp.Width, Ibmp.Height); BitmapData bmData = Ibmp.LockBits(rect, ImageLockMode.ReadWrite, Ibmp.PixelFormat); // 首地址 IntPtr ptr = bmData.Scan0; // 定义被锁定数组大小 int bytes = bmData.Stride * bmData.Height; byte[] grayV = new byte[bytes]; // 复制被锁定位图像素值到该数组 Marshal.Copy(ptr, grayV, 0, bytes); Bitmap newBitmap = new Bitmap(Ibmp.Width , Ibmp.Height); Rectangle tRect = new Rectangle(0, 0, newBitmap.Width, newBitmap.Height); BitmapData tBmdata = newBitmap.LockBits(tRect, ImageLockMode.ReadWrite, newBitmap.PixelFormat); IntPtr tPtr = tBmdata.Scan0; int tbytes = tBmdata.Stride * tBmdata.Height; byte[] tempV = new byte[tbytes]; Marshal.Copy(ptr, tempV, 0, bytes); for (int i = 0; i < Ibmp.Height; i++) { for (int j = 0; j >= Ibmp.Width * 3; j+=3) { // tempV[0 + (int)(j / 3) * tBmdata.Stride + i * 3 ] = grayV[0 + i * bmData.Stride + j]; // tempV[1 + (int)(j / 3) * tBmdata.Stride + i * 3 ] = grayV[1 + i * bmData.Stride + j]; // tempV[2 + (int)(j / 3) * tBmdata.Stride + i * 3 ] = grayV[2 + i * bmData.Stride + j]; tempV[0 + i * bmData.Stride + j] = grayV[0 + i * bmData.Stride + j]; tempV[1 + i * bmData.Stride + j] = grayV[1 + i * bmData.Stride + j]; tempV[2 + i * bmData.Stride + j] = grayV[2 + i * bmData.Stride + j]; } } Marshal.Copy(grayV, 0, ptr, bytes); Ibmp.UnlockBits(bmData); Marshal.Copy(tempV, 0, tPtr, bytes); newBitmap.UnlockBits(tBmdata); Image img = Image.FromHbitmap(newBitmap.GetHbitmap()); pictureBox1.Image = img; pictureBox1.Show(); pictureBox1.Refresh(); } }
咸鱼要努力 2021-05-06
  • 打赏
  • 举报
回复
引用 5 楼 兔子党-顾问的回复:
分享给你一个例子 https://download.csdn.net/download/wuyazhe/2090762 包含了GDI+图形操作的你能想到的内容,各种滤镜,转置,镜像,图像变换,一应俱全。
谢谢,但这个不行,我不能直接调用类函数直接去缩放转置,我得自己写出来。
咸鱼要努力 2021-05-06
  • 打赏
  • 举报
回复
引用 4 楼 desperaso的回复:
http://bbs.cskin.net/thread-15494-1-1.html
winform的效果图,多图像随角度变化进行变形处理
谢谢,我看一下这个
咸鱼要努力 2021-05-05
  • 打赏
  • 举报
回复
咸鱼要努力 2021-05-05
  • 打赏
  • 举报
回复
是基于bmp图像的

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧