VC++图像处理:实现像素灰度、对比度调整与mosaic效果

版权申诉
0 下载量 106 浏览量 更新于2024-10-11 收藏 49KB RAR 举报
资源摘要信息: "Bitmap_Conversion.rar_VC conversi_bitmap_mosaic_图像 转换_对比度" 本文档是一个有关VC++图像转换的资源包,包含了实现多种图像处理功能的代码示例。从标题和描述中,我们可以提取出以下几个关键知识点,这些知识点详细说明了资源包中所包含的技术内容和应用方法。 1. **VC++编程环境**: - VC++指的是Microsoft Visual C++,是一种广泛使用的集成开发环境(IDE),专门用于C++语言的开发。 - 它提供了丰富的库和工具,使得开发者能够创建Windows应用程序、各种服务和库。 2. **图像转换**: - 图像转换是指将图像从一种格式或状态转换为另一种格式或状态的过程。 - 这通常包括改变图像的大小、颜色深度、文件格式等。 - 在VC++中,可以使用GDI(图形设备接口)或GDI+来处理图像转换任务。 3. **像素灰度处理**: - 像素灰度处理是指将彩色图像转换为灰度图像,即图像中的每个像素只包含亮度信息,没有色彩信息。 - 在VC++中,可以通过调整RGB颜色模型中红色、绿色和蓝色三个分量的权重来实现灰度化处理。 4. **对比度调整**: - 对比度是指图像中最亮和最暗部分的亮度差,对比度越高,图像的细节和层次感越明显。 - 在VC++中,可以通过增强或减弱图像的亮度值来调整对比度。 5. **马赛克(mosaic)效果**: - 马赛克效果是一种图像处理技术,通过将图像分解为许多小块,使每个小块内颜色和亮度均一化,从而在视觉上产生特殊效果。 - 在VC++中,可以通过对图像进行分块处理,对每个块应用均一色或均一亮度的算法来实现马赛克效果。 6. **柔化效果**: - 柔化,也称为模糊效果,可以减少图像中的细节,使其看起来更加柔和。 - 在VC++中,可以通过卷积操作,使用不同类型的滤波器(如高斯模糊、均值模糊等)对图像进行柔化处理。 7. **波形扰动**: - 波形扰动是一种特殊的效果,它通过在图像上添加特定的波形来改变图像的形状或外观。 - 在VC++中,可以通过数学函数对图像坐标进行变换,生成波形的形状,并将此变换应用到原图上,实现波形扰动效果。 标签中提到的"vc_conversi"是"vc conversion"的缩写,表示这个资源包与VC++图像转换相关。"bitmap"指的是位图,一种图像文件格式。"mosaic"即马赛克,指代相关效果。"图像_转换"强调了资源包的核心功能,而"对比度"则是图像转换过程中可以调节的一个参数。 压缩包子文件的文件名称列表中的"***.txt"可能是资源包的描述文件或者是下载链接。"Bitmap_Conversion"可能是主要代码文件的名称,表明它与位图转换有关。 综上所述,此资源包是一套VC++代码库,旨在帮助开发者实现图像的多种处理功能,包括但不限于像素灰度处理、对比度调整、马赛克效果、柔化效果和波形扰动效果。这些技术在图像处理、图像编辑软件开发、视频处理、机器视觉等领域有着广泛的应用。开发者可以利用这些代码,快速实现复杂的图像处理功能,增强应用程序的视觉效果和用户体验。

请优化代码,以下代码无法释放焦点 ,不能变换拖动目标 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; }

2023-06-06 上传

以下代码 ,拖动功能正常,但是在用两根手指进行缩放和旋转时闪退,请您完善 。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; // 记录位图的旋转角度和缩放倍数 if (_curCustomBitmap == null) { return true; } _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) { // 移动图片 if (_curCustomBitmap == null) { return true; } 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) { // 缩放和旋转图片 if (_curCustomBitmap == null) { return true; } 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); }

2023-06-06 上传