C# Bitmap.Clone 方法,提示内存不足

Jave.Lin 2012-03-11 03:02:01
我独单的写一些测试。

测试过,发现提示内存不足的情况有两种:

以下内容中:bitmap原对象:bm.Clone(...),这时bm就是bitmap原对象

1、就是Clone第一个参数:Rectangle的:X,Y,Width,Height的值,如果相对于bitmap原对象来说,
都是越界值(X,Y出现负数,或是X,Y大于bitmap的宽高;Width,Heigth相对X,Y坐标截图后过大)

2、就是Clone第二个参数:PixelForm,如果bitmap原对象本身的像素格式是不兼容这颜色格式的,也会报错。

以下代码,我测试过,没有问题:

            //Bitmap bm = (Bitmap)Image.FromFile(@"Pic/WEB Study.jpg");
//Bitmap bSp = bm.Clone(new System.Drawing.Rectangle(0, 0, 1, 1), bm.PixelFormat);
//bSp.Save(@"MyCutPicturesExport/WEB Study.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);


以下的代码是,出现问题的代码:

Rectangle rect = row[colIndex];
Bitmap cutBitmap = pic.Clone(rect, pic.PixelFormat);

监视器下的对象数据:


pic.Width 1000 int
pic.Height 634 int
pic.PixelFormat Format24bppRgb System.Drawing.Imaging.PixelFormat
+ rect {X = 0 Y = 0 Width = 20 Height = 20} System.Drawing.Rectangle


第一个参数是没有出现越界值的,而第二个参数就是用回bitmap原对象的PixelForm,一样还是会出现:内存不足。
...全文
3227 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
零点突袭1 2013-12-28
  • 打赏
  • 举报
回复
引用 楼主 linjf520 的回复:
我独单的写一些测试。 测试过,发现提示内存不足的情况有两种: 以下内容中:bitmap原对象:bm.Clone(...),这时bm就是bitmap原对象 1、就是Clone第一个参数:Rectangle的:X,Y,Width,Height的值,如果相对于bitmap原对象来说, 都是越界值(X,Y出现负数,或是X,Y大于bitmap的宽高;Width,Heigth相对X,Y坐标截图后过大) 2、就是Clone第二个参数:PixelForm,如果bitmap原对象本身的像素格式是不兼容这颜色格式的,也会报错。 以下代码,我测试过,没有问题:
            //Bitmap bm = (Bitmap)Image.FromFile(@"Pic/WEB Study.jpg");
            //Bitmap bSp = bm.Clone(new System.Drawing.Rectangle(0, 0, 1, 1), bm.PixelFormat);
            //bSp.Save(@"MyCutPicturesExport/WEB Study.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
以下的代码是,出现问题的代码:

                        Rectangle rect = row[colIndex];
                        Bitmap cutBitmap = pic.Clone(rect, pic.PixelFormat);

监视器下的对象数据:


		pic.Width	1000	int
		pic.Height	634	int
		pic.PixelFormat	Format24bppRgb	System.Drawing.Imaging.PixelFormat
+		rect	{X = 0 Y = 0 Width = 20 Height = 20}	System.Drawing.Rectangle
第一个参数是没有出现越界值的,而第二个参数就是用回bitmap原对象的PixelForm,一样还是会出现:内存不足。
imageFrom这个从哪里来的呢
安卓er 2012-09-03
  • 打赏
  • 举报
回复
使用Graphics重新画一个 不使用Clone 这个方法不错 没有出现内存不足的情况了
Jave.Lin 2012-03-11
  • 打赏
  • 举报
回复
感谢两位大哥的回答。

原来是我的图片,加载时,使用Memoery ms来Bitmap bmp = new Bitmap(ms);

在new了之后,我就把之前的一些测试代码:ms.Dispose();了。

所以后面的一些对Bitmap的一些操作都会有问题。
EnForGrass 2012-03-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 linjf520 的回复:]
我独单的写一些测试。

测试过,发现提示内存不足的情况有两种:

以下内容中:bitmap原对象:bm.Clone(...),这时bm就是bitmap原对象

1、就是Clone第一个参数:Rectangle的:X,Y,Width,Height的值,如果相对于bitmap原对象来说,
都是越界值(X,Y出现负数,或是X,Y大于bitmap的宽高;Width,Heigth相对X,Y坐标……
[/Quote]
Bitmap.Clone提示内存不足的错误的话
1.使用Rectangle对象时超出了图像的大小范围。
2.在指定图像的颜色数据格式(PixelFormat)时,生成的颜色数据格式与原图的数据格式不一致也将导致这个错误的出现.比如一张JPG的图片,保存是使用PixelFormat.Format8bppIndexed就会出现这样的错误。
qldsrx 2012-03-11
  • 打赏
  • 举报
回复
建议你用Graphics 类画个新图。
                using (Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb))
{
bmp.SetResolution(imageFrom.HorizontalResolution, imageFrom.VerticalResolution);
using (Graphics g = Graphics.FromImage(bmp))
{

// 用白色清空
g.Clear(Color.White);

// 指定高质量的双三次插值法。执行预筛选以确保高质量的收缩。此模式可产生质量最高的转换图像。
g.InterpolationMode = InterpolationMode.HighQualityBicubic;

// 指定高质量、低速度呈现。
g.SmoothingMode = SmoothingMode.HighQuality;

// 在指定位置并且按指定大小绘制指定的 Image 的指定部分。
g.DrawImage(imageFrom, new Rectangle(X, Y, width, height), new Rectangle(0, 0, imageFromWidth, imageFromHeight), GraphicsUnit.Pixel);

}
}

111,097

社区成员

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

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

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