C#Bitmap保存一直提示GDI中发生一般性错误

johopig 2019-03-13 11:48:20
...全文
2144 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
平底锅锅锅 2019-03-18
  • 打赏
  • 举报
回复
图片格式改成其它的试试,也有可能图片有问题。
還是 2019-03-15
  • 打赏
  • 举报
回复
百度一份可用的代码不行吗,非要自己写? 代码中没有类似保存图片的代码吗,拿过来用就可以了。 自己先写一个小例子试一下,可以了在合并到代码中。 这个可以屏蔽其他的问题
stherix 2019-03-14
  • 打赏
  • 举报
回复
路径可能有问题,而且image名字和文件夹也是同名的,这不行 你试下@"D:\image.jpg"
johopig 2019-03-14
  • 打赏
  • 举报
回复
引用 1 楼 hztltgg 的回复:
save里写了个目录?需要一个文件名吧
已经写了文件名了,后来C盘目录下也有image这个文件夹,但是还是提示GDI发生一般性错误
hztltgg 2019-03-14
  • 打赏
  • 举报
回复
save里写了个目录?需要一个文件名吧
johopig 2019-03-14
  • 打赏
  • 举报
回复
谢谢上面帮助过的人,分有点少。。。谢谢你们哈~ 原来Save填写的路径必须存在,如果不确定是否存在可以先判断是否存在文件夹,然后再在这个文件夹里判断是否存在这个图片
                if (!System.IO.Directory.Exists(@"C:\\Users\\卢本伟\\Desktop\\Test\\Test\\image"))
                {
                    System.IO.Directory.CreateDirectory(@"C:\\Users\\卢本伟\\Desktop\\Test\\Test\\image");//不存在就创建文件夹 } 
                    //判断某文件是否存在 
                    if (File.Exists(@"C:\\Users\\卢本伟\\Desktop\\Test\\Test\\image" + name + ".png"))
                    {
                        return name;
                    }
                    else
                    {
                        image.Save("C:\\Users\\卢本伟\\Desktop\\Test\\Test\\image\\" + name + ".png", System.Drawing.Imaging.ImageFormat.Png);
                        return name;
                    }
                }
Save的话名称中不能包含目录,还要写好名称,记得写后缀,这里一直忘记给它写文件名了,只写到目录。。。。
johopig 2019-03-14
  • 打赏
  • 举报
回复
引用 24 楼 智者知已应修善业 的回复:
System.Drawing.Bitmap 图区 = new System.Drawing.Bitmap(100, 100); 图区.Save("d:\\ddddddddd.Bmp", System.Drawing.Imaging.ImageFormat.Bmp);
嗯嗯可以了谢谢你哈~
  • 打赏
  • 举报
回复
System.Drawing.Bitmap 图区 = new System.Drawing.Bitmap(100, 100);
图区.Save("d:\\ddddddddd.Bmp", System.Drawing.Imaging.ImageFormat.Bmp);
johopig 2019-03-14
  • 打赏
  • 举报
回复
引用 22 楼 智者知已应修善业 的回复:
System.Drawing.Bitmap 图区 = new System.Drawing.Bitmap(100, 100); 图区.Save("d:\\ddddddddd", System.Drawing.Imaging.ImageFormat.Bmp); 这样测试是可以的。
可以是可以了,但是这个Save不是保存到这个字符串的文件的目录下吗,为什么会不行,还有现在Save下来的图片都是这样的,需要手动改后缀名之后才能看到图片。。
  • 打赏
  • 举报
回复
System.Drawing.Bitmap 图区 = new System.Drawing.Bitmap(100, 100);
图区.Save("d:\\ddddddddd", System.Drawing.Imaging.ImageFormat.Bmp);
这样测试是可以的。
  • 打赏
  • 举报
回复
image.Save("C:\\imimim");这样试看,名称中含目录是不行的.
johopig 2019-03-14
  • 打赏
  • 举报
回复
引用 16 楼 hztltgg 的回复:
你说的C盘根目录下有image目录,然后又写c:\image也是有问题的,那个需要文件名,你存在一个目录了
我把它改为image.Save("C:\\im\\");之后还是不行。。。
johopig 2019-03-14
  • 打赏
  • 举报
回复
引用 18 楼 hztltgg 的回复:
如果文件夹不存在,save方法也是不能自动建文件夹的,需要事先建好
我在C盘右键只有一个文件夹可以新建,那现在就是没有权限创建文件夹是吗,那要怎么搞。。。
hztltgg 2019-03-14
  • 打赏
  • 举报
回复
如果文件夹不存在,save方法也是不能自动建文件夹的,需要事先建好
  • 打赏
  • 举报
回复
你试看加载一个图像上去看。
hztltgg 2019-03-14
  • 打赏
  • 举报
回复
你说的C盘根目录下有image目录,然后又写c:\image也是有问题的,那个需要文件名,你存在一个目录了
hztltgg 2019-03-14
  • 打赏
  • 举报
回复
试了代码,扩展名不写不是关键,生成的没有扩展名而已。你这个应该就是根目录下没有权限写文件,这个操作系统默认就这样了,你可以看看在C盘右键新建里面是不是只有文件夹,没有其他的。
johopig 2019-03-14
  • 打赏
  • 举报
回复
引用 13 楼 胖叔叔写代码 的回复:
管理员模式运行vs调试看看能行不?
还是不行。。。我服了
  • 打赏
  • 举报
回复
管理员模式运行vs调试看看能行不?
johopig 2019-03-14
  • 打赏
  • 举报
回复
引用 9 楼 hztltgg 的回复:
简化你的代码,去掉其他的,只保存图片看看出错吗?
还是会。。。
加载更多回复(8)
class CSBitmap //Bitmap类,特点紧约型数据结构,GetPixel效率高,放弃调色板,自动支持4种色深,特有的12位颜色更接近人眼可识别颜色数目;有多种缩放,色深转换,拷贝,剪切,和hBitmap转换,显示等功能;支持串行化。支持1,12,24,32位位图,对应适用于所有函数,相比于HBitmap和CSBitmap对象要简单,可直接操作数据区;同时可用于1,4,8,12,16,24,32位二维数列的储存,部分基本函数(GetPixel,SetPixel)支持; { public: CSBitmap(void); ~CSBitmap(void); unsigned int Width; //Bitmap的宽 unsigned int Height; //Bitmap的高 DWORD BitSize; //Bitmap的数据区大小(字节) BYTE* pBitData; //Bitmap的数据区指针 unsigned int BitCount; //Bitmap的色深 bool SetAttribute(unsigned int mWidth=NULL, unsigned int mHeight=NULL, unsigned int mBitCount=NULL); //设置Bitmap的属性,Bitmap会被清除 mWidth Bitmap的宽度,为NULL则不改变 mHeight Bitmap的高度,为NULL则不改变 mBitCount Bitmap的色深,为NULL则不改变 bool ImportBits(BYTE* lpBits, int mBitSize=NULL); //拷贝Bits数据进对象数据区 lpBits 拷贝数据的指针 mBitSize 拷贝数据的字节数 COLORREF GetPixel(unsigned int x, unsigned int y); //获得某点的原始数值,当为12,24,32位数时,则为RGB值 X,y 需要获取点的坐标 bool SetPixel(unsigned int x, unsigned int y, COLORREF clr); //获得某点的原始数值,当为12,24,32位数时,则为RGB值 X,y 需要设置点的坐标 bool StretchDIB(CSBitmap* DestBmp, unsigned int mWidth, unsigned int mHeight, unsigned int mFlag=0); //缩放 DestBmp用于获取缩放后图片的指针 mWidth, mHeight缩放后大小 mFlag缩放算法 取值 算法 缩小 放大 0 逆向寻点算法 效率高,质量一般 效率高,质量 1 双线性补点 效率低,质量一般 效率低,质量高 2 平均值算法 效率低,质量好 效率高,质量差 static BYTE GetRValue12(COLORREF Clr12Bit); static BYTE GetGValue12(COLORREF Clr12Bit); static BYTE GetBValue12(COLORREF Clr12Bit); //用于12位图的获取RGB分量,24位图,32位图的COLOR分离请用GDI的GetPixel() Clr12Bit 对12位图GetPixel获得的原始值 static COLORREF RGB12(BYTE R, BYTE G, BYTE B); //用于12位图的RGB合成,24位图,32位图的COLOR合成请用GDI的RGB() static COLORREF Color24To1(COLORREF Color24); //24位色深COLORREF转1位色深(黑白)值 static COLORREF Color24To12(COLORREF Color24); //24位色深COLORREF转12位色深值 static COLORREF Color1To24(COLORREF Color2); //1位色深COLORREF转24位,32位色深(黑白)值 static COLORREF Color12To24(COLORREF Color12); //12位色深COLORREF转24位,32位色深(黑白)值 bool ConvertTo1Bit(CSBitmap* DestBmp); //12,24,36位图片转换成1位色深图 DestBmp用于接收数据的DestBmp指针,转换过程包括自动参数重置 bool ConvertTo12Bit(CSBitmap* DestBmp); //1,24,36位图片转换成12位色深图 DestBmp用于接收数据的DestBmp指针,转换过程包括自动参数重置 bool ConvertTo24Bit(CSBitmap* DestBmp); //1,12,36位图片转换成24位色深图 DestBmp用于接收数据的DestBmp指针,转换过程包括自动参数重置 bool FromHandle(HBITMAP hBitmap); //从HBITMAP获得CSBitmap对象 bool CopyPaste(CSBitmap* DestBmp, unsigned int x, unsigned int y); //复制本CSBitmap至另一DestBmp的指定位置 DestBmp 目标,对象 X,y复制后图片左上角位置 bool PaintDIB(CDC* dcDest, int x,int y,unsigned int mWidth, unsigned int mHeight); //把本图片显示至CDC对象上,支持1,12,24,26位图 dcDest 目标dc(兼容DC) x,y 拷贝到dc上的位置 mWidth,mHeight拷贝后的大小 const CSBitmap& operator=(const CSBitmap &SBmp); }; //重载了 = 赋值操作符

111,097

社区成员

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

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

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