在下边的代码中 如何释放myPicControl1.GetBitmap Bitmap myBmp = new Bitmap(filepath+ filetype_jpg); using (Graphics graphics = Graphics.FromImage(myBmp)) { Font font = new Font("Black", 80, FontStyle.Bold); System.Drawing.Brush brush = new SolidBrush(Color.FromArgb(128, Color.LightGray)); graphics.TranslateTransform(myBmp.Width / 2, myBmp.Height / 2); graphics.RotateTransform(330f); graphics.DrawString(watermark, font, brush, -2100, -100); //graphics.RotateTransform(135f); TabPage_JPG.Show(); } myPicControl1.GetBitmap = myBmp;
时间: 2023-12-10 18:03:16 浏览: 58
你可以在代码的结尾使用以下语句释放Bitmap对象:
```
myBmp.Dispose();
```
这将释放Bitmap对象占用的内存。当然,如果你使用的是using语句,程序会自动释放Bitmap对象,这样你就不需要手动释放它了。
```
using (Bitmap myBmp = new Bitmap(filepath+ filetype_jpg))
{
using (Graphics graphics = Graphics.FromImage(myBmp))
{
Font font = new Font("Black", 80, FontStyle.Bold);
System.Drawing.Brush brush = new SolidBrush(Color.FromArgb(128, Color.LightGray));
graphics.TranslateTransform(myBmp.Width / 2, myBmp.Height / 2);
graphics.RotateTransform(330f);
graphics.DrawString(watermark, font, brush, -2100, -100);
myPicControl1.GetBitmap = myBmp;
}
}
```
这样你就不需要手动释放Bitmap对象了。
相关问题
请优化代码,以下代码无法释放焦点 ,不能变换拖动目标 public boolean onTouchEvent(MotionEvent event) { switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: // 手指压下屏幕 mode = MODE.DRAG; // 寻找被点击的图片 CustomBitmap clickedBitmap = null; for (CustomBitmap bitmap : _bitmaps) { float[] values = new float[9]; bitmap.matrix.getValues(values); float globalX = values[Matrix.MTRANS_X]; float globalY = values[Matrix.MTRANS_Y]; float width = values[Matrix.MSCALE_X] * bitmap.getBitmap().getWidth(); float height = values[Matrix.MSCALE_Y] * bitmap.getBitmap().getWidth(); Rect rect = new Rect((int) globalX, (int) globalY, (int) (globalX + width), (int) (globalY + height)); if (rect.contains((int) event.getX(), (int) event.getY())) { clickedBitmap = bitmap; break; } } // 切换操作对象 if (clickedBitmap != null) { _bitmaps.remove(clickedBitmap); _bitmaps.add(clickedBitmap); currentMatrix.set(clickedBitmap.matrix);// 记录ImageView当前的移动位置 clickedBitmap.matrix.set(currentMatrix); clickedBitmap.startPoint.set(event.getX(), event.getY()); _curCustomBitmap = clickedBitmap; } postInvalidate(); break; case MotionEvent.ACTION_POINTER_DOWN: // 当屏幕上还有触点(手指),再有一个手指压下屏幕 mode = MODE.ZOOM; _curCustomBitmap.oldRotation = rotation(event); _curCustomBitmap.startDis = distance(event); if (_curCustomBitmap.startDis > 10f) { _curCustomBitmap.midPoint = mid(event); currentMatrix.set(_curCustomBitmap.matrix);// 记录ImageView当前的缩放倍数 } break; case MotionEvent.ACTION_MOVE: // 手指在屏幕移动,该事件会不断地触发 if (mode == MODE.DRAG) { float dx = event.getX() - _curCustomBitmap.startPoint.x;// 得到在x轴的移动距离 float dy = event.getY() - _curCustomBitmap.startPoint.y;// 得到在y轴的移动距离 _curCustomBitmap.matrix.set(currentMatrix);// 在没有进行移动之前的位置基础上进行移动 _curCustomBitmap.matrix.postTranslate(dx, dy); } else if (mode == MODE.ZOOM) {// 缩放与旋转 float endDis = distance(event);// 结束距离 _curCustomBitmap.rotation = rotation(event) - _curCustomBitmap.oldRotation; if (endDis > 10f) { float scale = endDis / _curCustomBitmap.startDis;// 得到缩放倍数 _curCustomBitmap.matrix.set(currentMatrix); _curCustomBitmap.matrix.postScale(scale, scale, _curCustomBitmap.midPoint.x, _curCustomBitmap.midPoint.y); _curCustomBitmap.matrix.postRotate(_curCustomBitmap.rotation, _curCustomBitmap.midPoint.x, _curCustomBitmap.midPoint.y); } } break; case MotionEvent.ACTION_UP: // 手指离开屏 break; case MotionEvent.ACTION_POINTER_UP: // 有手指离开屏幕,但屏幕还有触点(手指) mode = MODE.NONE; break; } invalidate(); return true; }
以下是对代码的优化建议:
1. 将对位图的操作封装成一个方法,以提高可读性和可维护性。
2. 在ACTION_DOWN事件中,可以使用MotionEvent的findPointerIndex()和getX()、getY()方法来获取点击位置,避免使用循环查找位图。
3. 在ACTION_MOVE事件中,可以使用Matrix的postTranslate()和postScale()方法来进行位图的移动和缩放,避免重复创建Matrix对象。
4. 在ACTION_POINTER_DOWN事件中,可以使用MotionEvent的getX()、getY()方法来获取缩放中心点的坐标,避免重复计算。
5. 在ACTION_POINTER_DOWN事件中,可以将记录位图旋转角度和缩放倍数的代码提取出来,避免与缩放和旋转的代码耦合。
6. 在ACTION_POINTER_UP事件中,可以将模式设置为MODE.NONE,避免在其他事件中误操作。
7. 在代码中添加注释,以提高可读性和可维护性。
下面是优化后的代码:
```
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
// 手指压下屏幕
mode = MODE.DRAG;
// 查找被点击的图片
int index = event.getActionIndex();
float x = event.getX(index);
float y = event.getY(index);
CustomBitmap clickedBitmap = findClickedBitmap(x, y);
if (clickedBitmap != null) {
// 切换操作对象
_bitmaps.remove(clickedBitmap);
_bitmaps.add(clickedBitmap);
// 记录ImageView当前的移动位置
currentMatrix.set(clickedBitmap.matrix);
clickedBitmap.matrix.set(currentMatrix);
clickedBitmap.startPoint.set(x, y);
_curCustomBitmap = clickedBitmap;
}
postInvalidate();
break;
case MotionEvent.ACTION_POINTER_DOWN:
// 当屏幕上还有触点(手指),再有一个手指压下屏幕
mode = MODE.ZOOM;
// 记录位图的旋转角度和缩放倍数
_curCustomBitmap.oldRotation = rotation(event);
_curCustomBitmap.startDis = distance(event);
if (_curCustomBitmap.startDis > 10f) {
// 获取缩放中心点的坐标
float x1 = event.getX(0);
float y1 = event.getY(0);
float x2 = event.getX(1);
float y2 = event.getY(1);
_curCustomBitmap.midPoint.set((x1 + x2) / 2, (y1 + y2) / 2);
// 记录ImageView当前的缩放倍数
currentMatrix.set(_curCustomBitmap.matrix);
}
break;
case MotionEvent.ACTION_MOVE:
// 手指在屏幕移动,该事件会不断地触发
if (mode == MODE.DRAG) {
// 移动图片
float dx = event.getX() - _curCustomBitmap.startPoint.x;
float dy = event.getY() - _curCustomBitmap.startPoint.y;
_curCustomBitmap.matrix.set(currentMatrix);
_curCustomBitmap.matrix.postTranslate(dx, dy);
} else if (mode == MODE.ZOOM) {
// 缩放和旋转图片
float endDis = distance(event);
float rotation = rotation(event) - _curCustomBitmap.oldRotation;
if (endDis > 10f) {
float scale = endDis / _curCustomBitmap.startDis;
_curCustomBitmap.matrix.set(currentMatrix);
_curCustomBitmap.matrix.postScale(scale, scale, _curCustomBitmap.midPoint.x, _curCustomBitmap.midPoint.y);
_curCustomBitmap.matrix.postRotate(rotation, _curCustomBitmap.midPoint.x, _curCustomBitmap.midPoint.y);
}
}
break;
case MotionEvent.ACTION_POINTER_UP:
// 有手指离开屏幕,但屏幕还有触点(手指)
mode = MODE.NONE;
break;
}
invalidate();
return true;
}
// 查找被点击的图片
private CustomBitmap findClickedBitmap(float x, float y) {
for (CustomBitmap bitmap : _bitmaps) {
float[] values = new float[9];
bitmap.matrix.getValues(values);
float globalX = values[Matrix.MTRANS_X];
float globalY = values[Matrix.MTRANS_Y];
float width = values[Matrix.MSCALE_X] * bitmap.getBitmap().getWidth();
float height = values[Matrix.MSCALE_Y] * bitmap.getBitmap().getHeight();
RectF rect = new RectF(globalX, globalY, globalX + width, globalY + height);
if (rect.contains(x, y)) {
return bitmap;
}
}
return null;
}
// 计算两点之间的距离
private float distance(MotionEvent event) {
float x1 = event.getX(0);
float y1 = event.getY(0);
float x2 = event.getX(1);
float y2 = event.getY(1);
return (float) Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
// 计算两点之间的旋转角度
private float rotation(MotionEvent event) {
float x1 = event.getX(0);
float y1 = event.getY(0);
float x2 = event.getX(1);
float y2 = event.getY(1);
double radians = Math.atan2(y2 - y1, x2 - x1);
return (float) Math.toDegrees(radians);
}
```
用下面得到的图片地址selectedImagePath是不存在的,为什么?怎么才能找到图片并上传@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { if (requestCode == REQUEST_IMAGE_CAPTURE) { Bitmap photo = (Bitmap) data.getExtras().get("data"); Uri tempUri = getImageUri(photo); selectedImagePath = tempUri.getPath(); imageView.setImageBitmap(photo); } else if (requestCode == REQUEST_IMAGE_PICK) { Uri selectedImageUri = data.getData(); selectedImagePath = selectedImageUri.getPath(); try { Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImageUri); imageView.setImageBitmap(bitmap); } catch (IOException e) { e.printStackTrace(); } } } }
图片地址`selectedImagePath`不存在的原因可能是选择的图片路径不正确或者图片文件不存在。为了找到图片并上传,可以尝试以下方法:
1. 检查图片路径:确保`selectedImagePath`变量中保存的是正确的图片路径。您可以使用Log或者Toast输出该路径,然后手动检查该路径是否正确。
2. 使用相册或文件管理器:如果选择的是从相册中选择图片,可以尝试使用文件管理器或相册应用来查看和确认选择的图片是否存在。在文件管理器中浏览到相应路径,检查是否存在该图片文件。
3. 权限问题:如果您没有读取存储权限,可能无法访问设备上的图片文件。确保您的应用已经获取了读取存储权限,并且在运行时已经获得了相应权限。
4. 使用其他方式加载图片:如果无法使用`selectedImagePath`加载图片,您可以尝试其他方式来加载图片,比如使用`BitmapFactory`或者`Picasso`库。这些方法可以通过文件路径或者URI来加载图片,并且会提供更详细的错误信息以帮助您找到问题所在。
请注意,以上方法可能需要根据您的具体应用和代码情况进行适当调整和修改。
阅读全文