理财秘籍

bitmapimage重绘后不出现bitmapimages

Wang 0

大家好,今天小编来为大家解答以下的问题,关于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.DoubleClick

DimGraAsGraphics=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的内容到此结束了,希望对大家有所帮助。

相关内容