Jam*_*mie 4 android surfaceview xamarin.android xamarin android-bitmap
我正在尝试SurfaceView使用以下代码为我的实际绘制位图:(这将在另一个Thread和 a 中运行while,因为它需要刷新SurfaceView)。
while (true)
{
try
{
// Enable drawing
// ERROR LINE!
Canvas ca = mPreview2.Holder.LockCanvas();
// Get current frame
Bitmap test = mediaPlayer.CurrentFrame;
// Actual drawing
Paint paint = new Paint();
ca.DrawBitmap(test, 0, 0, paint);
// Stop drawing
mPreview2.Holder.UnlockCanvasAndPost(ca);
} catch (Exception ex)
{
throw ex;
}
}
Run Code Online (Sandbox Code Playgroud)
但是我有以下错误:(这是在线发生的: Canvas ca = mPreview2.Holder.LockCanvas();
Java.Lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.Bitmap.isRecycled()' on a null object reference
Run Code Online (Sandbox Code Playgroud)
现在我可以绘制位图,但我还有一个问题!
因为右屏幕的质量真的很差(见图):
问题解决了:
我所做的使用是MemoryStream其压缩Bitmap为100,质量.JPG和解码byte array的Bitmap。现在效果很好!见下面的代码:
private void DrawCanvas()
{
while (true)
{
Canvas canvas = holder2.LockCanvas();
if (canvas != null)
{
Bitmap currentBitmap = mediaPlayer.CurrentFrame;
if(currentBitmap != null)
{
Paint paint = new Paint();
MemoryStream ms = new MemoryStream();
currentBitmap.Compress(Bitmap.CompressFormat.Jpeg, 100, ms);
byte[] bitmapData = ms.ToArray();
Bitmap bitmap = BitmapFactory.DecodeByteArray(bitmapData, 0, bitmapData.Length);
Bitmap scaledBitmap = Bitmap.CreateScaledBitmap(bitmap, mPreview2.Width, mPreview2.Height, true);
canvas.DrawBitmap(scaledBitmap, 0, 0, paint);
bitmap.Recycle();
scaledBitmap.Recycle();
currentBitmap.Recycle();
}
holder2.UnlockCanvasAndPost(canvas);
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6881 次 |
| 最近记录: |