bitmapimage重绘后不出现bitmapimages
大家好,今天小编来为大家解答以下的问题,关于bitmap image重绘后不出现,bitmap images这个很多人还不知道,现在让我们一起来看看吧!
本文目录
如何释放canvas对bitmap的引用bitmapimage重绘后不出现VB中窗体绘图在最小化后消失,如何解决寻高人!小弟想用C#做一个心形的窗体!如何释放canvas对bitmap的引用Android内存优化-方式五:Bitmap类的对象要及时主动释放原创
2019-04-0113:57:32

yaoming168
码龄11年
关注
Bitmap类的对象要及时主动释放
1.若是成员函数中的临时变量,已经没用的bitmap对象要及时调用recycle()释放,例如:mBitWallPaper.recycle();mBitWallPaper=null;System.gc();
2.Activity中的全局Bitmap对象,需要在onDestroy()中明确释放。
3若执行了ImageView.setImageBitmap(bitmap),紧接着又执行bitmap.recycle(),若ImageView没有进行重绘,不会报错,否则则会报错“AndroidIllegalArgumentException:Cannotdrawrecycledbitmaps”
4.若是不能保证Bitmap不能正确释放.可采用ImageView.getDrawingCache().recycle();来释放。同样有效
在Android应用里,最耗费内存的就是图片资源。而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常。所以,对于图片的内存优化,是Android应用开发中比较重要的内容。
捕获异常
因为Bitmap是吃内存大户,为了避免应用在分配Bitmap内存的时候出现OutOfMemory异常以后Crash掉,需要特别注意实例化Bitmap部分的代码。通常,在实例化Bitmap的代码中,一定要对OutOfMemory异常进行捕获。
这里对初始化Bitmap对象过程中可能发生的OutOfMemory异常进行了捕获。如果发生了OutOfMemory异常,应用不会崩溃,而是得到了一个默认的Bitmap图。
很多开发者会习惯性的在代码中直接捕获Exception。但是对于OutOfMemoryError来说,这样做是捕获不到的。因为OutOfMemoryError是一种Error,而不是Exception。在此仅仅做一下提醒,避免写错代码而捕获不到OutOfMemoryError。
1涉及到Drawable转bitmap时需要区分drawable是NinePatchDrawable还是BitmapDrawable,如果是NinePatchDrawable就不能直接转为BitmapDrawable来取得Bitmap了,为了解决改问题编写下面的转换工具:
packagecore.util;
importandroid.graphics.Bitmap;
importandroid.graphics.Canvas;
importandroid.graphics.PixelFormat;
importandroid.graphics.drawable.BitmapDrawable;
importandroid.graphics.drawable.Drawable;
importandroid.graphics.drawable.NinePatchDrawable;
importcore.base.XBaseApplication;
/**
@Description:bitmap、drawable转换工具
@Functions:
@Author:
@Date:2016-02-17
/
publicclassBitmapUtil{
publicstaticDrawablebitmap2Drawable(intresId){
Drawabled=XBaseApplication.getApplication().getResources().getDrawable(resId);
returnd;
}
/*
bitmaptodrawable
@parambitmap
@return
/
publicstaticDrawablebitmap2Drawable(Bitmapbitmap){
returnnewBitmapDrawable(bitmap);
}
/*
drawabletobitmap
@paramdrawable
@return
*/
publicstaticBitmapdrawable2Bitmap(Drawabledrawable){
if(drawableinstanceofBitmapDrawable){//转换成Bitmap
return((BitmapDrawable)drawable).getBitmap();
}elseif(drawableinstanceofNinePatchDrawable){//.9图片转换成Bitmap
Bitmapbitmap=Bitmap.createBitmap(
drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight(),
drawable.getOpacity()!=PixelFormat.OPAQUE?
Bitmap.Config.ARGB_8888:Bitmap.Config.RGB_565);
Canvascanvas=newCanvas(bitmap);
drawable.setBounds(0,0,drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight());
drawable.draw(canvas);
returnbitmap;
}else{
returnnull;
}
}
}
bitmapimage重绘后不出现题主是否想询问“bitmapimage重绘后不出现怎么办”?
1、首先重新打开bitmapimage重绘系统。
2、其次在系统中找到控制管理栏。
2、最后在管理栏中点击删除,重新绘制即可。
VB中窗体绘图在最小化后消失,如何解决当窗体被隐藏之后,在窗体重新出现时,系统将触发Paint事件,重绘整个窗体,此时如果Paint方法为空,那么您使用graphic对象绘制的图将全部消失。
要使您绘制的图能始终出现,您就必须在Paint事件触发时,在其方法中添加绘制窗体的代码。由于您的图是任意的,所以您可以通过使用一个全局的数组或数据结构存储在Form上的图像信息,然后在Form_Paint方法中读取图像信息并重绘。如果Form上绘制了新的图像,那么您可以将这个图像信息添加到全局的数组或数据结构中,以保证在Form上始终是正确的图像。
另外:
VB.NET2008中的AutoRedraw问题
.NET2009-05-0415:55:22阅读44评论0字号:大中小
VB6中的PictureBox控件的有AutoRedraw属性,设置为True,则窗口最小化或被覆盖后重新打开窗口,原来的图形还在(使用Line等函数画的图形),但VB.NET没有了这个属性,为此烦了好久,MSDN上也没有找到明确的代用方法,上星期去书店翻了翻,终于明白怎么会事.
PrivateSubForm1_Load(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesMyBase.Load
DimBmpAsBitmap
DimGraAsGraphics
DimPenAsNewPen(Color.White)
Bmp=NewBitmap(PictureBox1.Width,PictureBox1.Height)
Gra=Graphics.FromImage(Bmp)
DimDiaAsSingle=Math.Min(PictureBox1.Height,PictureBox1.Width)*0.5!
Gra.DrawArc(Pen,(PictureBox1.Width-Dia)/2.0!,(PictureBox1.Height-Dia)/2.0!,Dia,Dia,0,360)
Gra.DrawLine(Pen,0,0,PictureBox1.Width/2.0!,PictureBox1.Height/2.0!)
PictureBox1.Image=Bmp
EndSub
上面代码画的图形在最小化后重新打开图形还在,下面的则没有了.
PrivateSubPictureBox1_DoubleCli
ck(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesPictureBox1.DoubleClickDimGraAsGraphics=PictureBox1.CreateGraphics()
DimPenAsNewPen(Color.Magenta)
DimDiaAsSingle=Math.Min(PictureBox1.Height,PictureBox1.Width)*0.5!
Gra.DrawRectangle(Pen,(PictureBox1.Width-Dia)/2.0!,(PictureBox1.Height-Dia)/2.0!,Dia,Dia)
EndSub
希望对你有帮助!
寻高人!小弟想用C#做一个心形的窗体!一、自定义窗体,一般为规则的图形,如圆、椭圆等。
做法:重写Form1_Paint事件(Form1是窗体的名字),最简单的一种情况如下:
System.Drawing.Drawing2D.GraphicsPathshape=newSystem.Drawing.Drawing2D.GraphicsPath();
shape.AddEllipse(0,0,this.Height,this.Width);
this.Region=newRegion(shape);
即重绘窗体的规则。
二、利用背景图片实现
1.设置窗体的背景图片,其中背景图片是24位(不包括24)以下的位图(BMP图片),并且要设置TansparencyKey的值,一般为你背景图片的背景色,即创建不规则图片时的底色,一般设为你图片中没有的颜色。
这种做法的不好的地方就是背景图片一定要16位或者更低的,而且还要确保客户端的显示。如果监视器的颜色深度设置大于24位,则不管TransparencyKey属性是如何设置的,窗体的非透明部分都会产生显示问题。若要避免出现这种问题,请确保“显示”控制面板中的监视器颜色深度的设置小于24位。当开发具有这种透明功能的应用程序时,请牢记应使您的用户意识到此问题。
实现步骤如下:
1.新建windowsapplication
2.选择窗体,找到BackgroundImage属性,点击打开新的窗口,选择下面的导入资源文件,选择你的不规则的BMP图片
3.找到窗体的TansparencyKey,将它设置为你背景图片的背景色(如黄色)
4.找到窗体的FormBorderStyle,将其设置为none,即不显示标题栏
5.运行
<!--[endif]-->
2.跟背景图片一样的图形,不过是动态加载,遍历位图以实现不规则窗体。它的原理是这样的,在Form的load事件中写方法使得窗体的描绘区域发生改变。
实现步骤如下:
1.建立winform应用程序
2.找到窗体的Load事件,双击进行编辑
3.编写方法,主要的代码如下:
代码
classBitmapRegion
{
publicBitmapRegion()
{}
///<summary>
///Createandapplytheregiononthesuppliedcontrol
///创建支持位图区域的控件(目前有button和form)
///</summary>
///<paramname="control">TheControlobjecttoapplytheregionto控件</param>
///<paramname="bitmap">TheBitmapobjecttocreatetheregionfrom位图</param>
publicstaticvoidCreateControlRegion(Controlcontrol,Bitmapbitmap)
{
//Returnifcontrolandbitmaparenull
//判断是否存在控件和位图
if(control==null||bitmap==null)
return;
//Setourcontrol''ssizetobethesameasthebitmap
//设置控件大小为位图大小
control.Width=bitmap.Width;
control.Height=bitmap.Height;
//CheckifwearedealingwithFormhere
//当控件是form时
if(controlisSystem.Windows.Forms.Form)
{
//CasttoaFormobject
//强制转换为FORM
Formform=(Form)control;
//Setourform''ssizetobealittlelargerthatthebitmapjust
//incasetheform''sborderstyleisnotsettononeinthefirstplace
//当FORM的边界FormBorderStyle不为NONE时,应将FORM的大小设置成比位图大小稍大一点
form.Width=control.Width;
form.Height=control.Height;
//Noborder
//没有边界
form.FormBorderStyle=FormBorderStyle.None;
//Setbitmapasthebackgroundimage
//将位图设置成窗体背景图片
form.BackgroundImage=bitmap;
//Calculatethegraphicspathbasedonthebitmapsupplied
//计算位图中不透明部分的边界
GraphicsPathgraphicsPath=CalculateControlGraphicsPath(bitmap);
//Applynewregion
//应用新的区域
form.Region=newRegion(graphicsPath);
}
//CheckifwearedealingwithButtonhere
//当控件是button时
elseif(controlisSystem.Windows.Forms.Button)
{
//Casttoabuttonobject
//强制转换为button
Buttonbutton=(Button)control;
//Donotshowbuttontext
//不显示buttontext
button.Text="";
//Changecursortohandwhenoverbutton
//改变cursor的style
button.Cursor=Cursors.Hand;
//Setbackgroundimageofbutton
//设置button的背景图片
button.BackgroundImage=bitmap;
//Calculatethegraphicspathbasedonthebitmapsupplied
//计算位图中不透明部分的边界
GraphicsPathgraphicsPath=CalculateControlGraphicsPath(bitmap);
//Applynewregion
//应用新的区域
button.Region=newRegion(graphicsPath);
}
}
///<summary>
///Calculatethegraphicspaththatrepresentingthefigureinthebitmap
///excludingthetransparentcolorwhichisthetopleftpixel.
/////计算位图中不透明部分的边界
///</summary>
///<paramname="bitmap">TheBitmapobjecttocalculateourgraphicspathfrom</param>
///<returns>Calculatedgraphicspath</returns>
privatestaticGraphicsPathCalculateControlGraphicsPath(Bitmapbitmap)
{
//CreateGraphicsPathforourbitmapcalculation
//创建GraphicsPath
GraphicsPathgraphicsPath=newGraphicsPath();
//Usethetopleftpixelasourtransparentcolor
//使用左上角的一点的颜色作为我们透明色
ColorcolorTransparent=bitmap.GetPixel(0,0);
//Thisistostorethecolumnvaluewhereanopaquepixelisfirstfound.
//Thisvaluewilldeterminewherewestartscanningfortrailingopaquepixels.
//第一个找到点的X
intcolOpaquePixel=0;
//Gothroughallrows(Yaxis)
//偏历所有行(Y方向)
for(introw=0;row<bitmap.Height;row++)
{
//Resetvalue
//重设
colOpaquePixel=0;
//Gothroughallcolumns(Xaxis)
//偏历所有列(X方向)
for(intcol=0;col<bitmap.Width;col++)
{
//Ifthisisanopaquepixel,markitandsearchforanymoretrailingbehind
//如果是不需要透明处理的点则标记,然后继续偏历
if(bitmap.GetPixel(col,row)!=colorTransparent)
{
//Opaquepixelfound,markcurrentposition
//记录当前
colOpaquePixe
l=col;//Createanothervariabletosetthecurrentpixelposition
//建立新变量来记录当前点
intcolNext=col;
//Startingfromcurrentfoundopaquepixel,searchforanymoreopaquepixels
//trailingbehind,untilatransparentpixelisfoundorminimumwidthisreached
///从找到的不透明点开始,继续寻找不透明点,一直到找到或则达到图片宽度
for(colNext=colOpaquePixel;colNext<bitmap.Width;colNext++)
if(bitmap.GetPixel(colNext,row)==colorTransparent)
break;
//Formarectangleforlineofopaquepixelsfoundandaddittoourgraphicspath
//将不透明点加到graphicspath
graphicsPath.AddRectangle(newRectangle(colOpaquePixel,row,colNext-colOpaquePixel,1));
//Noneedtoscanthelineofopaquepixelsjustfound
col=colNext;
}
}
}
//Returncalculatedgraphicspath
returngraphicsPath;
}
}
4.运行
<!--[endif]-->
OK,关于bitmap image重绘后不出现和bitmap images的内容到此结束了,希望对大家有所帮助。