【问题标题】:Canvas scaling retains pixel size画布缩放保留像素大小
【发布时间】:2012-09-09 19:37:19
【问题描述】:

我正在尝试对相机预览进行一些图像处理,但是由于采样时间太慢,我在图像的采样时间下并在较小的范围内进行处理。然后我将处理后的(阈值)图像覆盖在预览上。我的问题是,当我缩放较小的图像以适应相机预览时,像素保持相同的大小......由于缩放,我想看到一些大像素,但我不能。

这是 XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true"
    android:orientation="vertical" >

    <SurfaceView
        android:id="@+id/svPreview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <SurfaceView
        android:id="@+id/svOverlay"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:adjustViewBounds="true" />
</RelativeLayout>

以及获取相机预览图像字节并进行阈值处理的线程:

class PathThread extends Thread implements PreviewCallback
{
    private final int width, height;
    private final SurfaceHolder holder;
    private Canvas overlayCanvas;
    private int samples = 8;

    final private float scale;
    final private Paint red, blue, yellow;

    public PathThread(int canvasWidth, int canvasHeight, SurfaceView canvasView)
    {
        // This is how much smaller image I want
        width = canvasWidth / samples;
        height = canvasHeight / samples;
        holder = canvasView.getHolder();

        // Scale to fit the camera preview SurfaceView
        scale = (float) canvasView.getWidth() / height;

        // No smoothing when scaling please
        yellow = new Paint();
        yellow.setColor(Color.parseColor("#ffbb33"));
        yellow.setAntiAlias(false);  
        yellow.setDither(false);  
        yellow.setFilterBitmap(false);
    }

    public void onPreviewFrame(byte[] data, Camera camera)
    {
        overlayCanvas = holder.lockCanvas();
        overlayCanvas.drawColor(0, Mode.CLEAR);
        overlayCanvas.scale(scale, scale);

        // Do the image processing and make a [samples] times smaller image
        // Boring, pseudo-optimized, per-pixel thresholding process

        holder.unlockCanvasAndPost(overlayCanvas);
    }
}

这是结果:

我知道它有点偏移,但这是我的问题中最少的。

【问题讨论】:

    标签: android image-processing scaling


    【解决方案1】:

    解决方案:

    经过 2 多天的搜索,它很简单,但不是很容易找到/理解:

    对于我绘制的 SurfaceView 的持有者,我不得不这样称呼:

    canvasHolder.setFixedSize(width, height);
    

    我尝试了不同的值并找到了我需要的值。这使得大像素

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多