2014-06-11 60 views
2

我正在使用SurfaceTexture繪製相機的預覽圖,並且需要知道紋理的大小+在此過程中發生了什麼SurfaceTexture大小,它是如何定義的?

比方說由設備所支持的相機預覽大小爲:

1280 720 1024 576 960 720 800 600 800 480 768 576 736 552等。

很明顯,有這些尺寸和標準的紋理尺寸之間的不匹配2048×2048,2048×1024,1024×1024 ...

我能想到下面跟隨的情況,但我不確定:

1, surface texture is in size of selected preview size, eg 1280 x 720, but that is not pow2 format and could mean compatibility problems

1,表面紋理是在選擇的預覽大小,例如1280×720的大小,但是這不是POW2格式和可能意味着兼容性問題

2, surface texture is contained within next size of pow2 format, untransformed, for example 1280x720 would be contained within 2048 x 1024 texture, no stretching, part of the texture remains unused

2,表面紋理被包含的下一尺寸內pow2格式,未轉換,例如1280x720將包含在2048 x 1024的紋理內,沒有拉伸,部分紋理保持未使用狀態。

3, surface texture is sized up to fit next pow2 texture (perhaps even sized down), image proportions are lost, and also quality suffers. eg 1280 x 720 stretched across 2048 x 1024.

3,表面紋理的尺寸至多適合下一POW2質地(甚至尺寸下),圖像的比例都將丟失,也質量受到影響。例如1920 x 1080橫跨2048 x 2048.

4,其他一些可能性?

相機預覽如何映射到紋理以及最終定義的紋理大小如何?

+2

我猜想它可以是三個中的任何一個,具體取決於供應商的具體實現。您應該使用SurfaceTexture.getTransformMatrix來獲取紋理座標(s,t)的映射。而且這種轉換可以爲每種情況做映射。 – harism

+0

感謝您的想法。我問的原因是因爲我在路上的某處失去了質量,與庫存相機相比。我得到了稍微鋸齒狀的邊緣,就好像它經歷了其他有損變形(是的,我正在使用線性濾波器)。也許我的1280x720預覽大小是通過1024px的紋理。如果我有辦法檢查紋理的大小,它可以確認它的真實與否。我之前檢查過getTransformMatrix以及opengl投影,並且這些似乎沒有任何相對轉換(所有(s,t)座標爲1或0) – Jayco

回答

2

其實當你預覽你有緩衝區,你可以設置爲「保持」「大」的決議。

Size mPreviewSize; 

CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE); 

String cameraId = manager.getCameraIdList()[0]; 
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); 

StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); 
mPreviewSize = map.getOutputSizes(SurfaceTexture.class)[0]; 

SurfaceTexture texture = mTextureView.getSurfaceTexture(); 
// We configure the size of default buffer to be the size of camera 
// preview we want. 
texture.setDefaultBufferSize(mPreviewSize.getWidth(),mPreviewSize.getHeight()); 
+0

在這種情況下,mPreviewSize是什麼?我希望將其設置爲我的設備可支持的最大相機分辨率。 – Euridice01

+0

上線'mPreviewSize = map.getOutputSizes(SurfaceTexture.class)[0];'它將其設置爲攝像機支持的最大值 – gmetax

相關問題