你好开发人员在这里。
最近我修改了一个ColorOS Camera端口,使其可以在我的设备上运行(小米Mi4)。 实际上这个应用程序只适用于XML版本。但排除的是这个应用程序使用默认的android jpeg压缩(在我的情况下jpegquality = 85%)
我刚决定修改smali文件来改变它。我已经修改了突发模式以捕获具有100%质量的jpeg(更改值0x4B到0x64以获得100%质量而不是75%在突发模式下它起作用) 当我尝试编辑其他线以使jpeg质量= 100%时,即使使用正常的击球模式,也会出现问题。
有人可以帮我解释一下吗? (请不要忘记我是初学者,我花了很多时间尝试编辑)
这是smali代码(来自CameraProcessManager.smali)
.method public setCaptureJpegOrientationAndQuality(I)V
.locals 4
.param p1, "orientation" # I
.prologue
.line 1338
iput p1, p0, Lcom/oppo/camera/CameraProcessManager;->mJpegRotation:I
.line 1339
iget-boolean v1, p0, Lcom/oppo/camera/CameraProcessManager;->mbBurstShot:Z
if-eqz v1, :cond_0
.line 1340
const/16 v0, 0x64
.line 1345
.local v0, "jpegQuality":I
:goto_0
iget-object v1, p0, Lcom/oppo/camera/CameraProcessManager;->mParameterManager:Lcom/oppo/camera/ParameterManager;
iget v2, p0, Lcom/oppo/camera/CameraProcessManager;->mJpegRotation:I
invoke-virtual {v1, v2}, Lcom/oppo/camera/ParameterManager;->setRotation(I)V
.line 1346
iget-object v1, p0, Lcom/oppo/camera/CameraProcessManager;->mParameterManager:Lcom/oppo/camera/ParameterManager;
invoke-virtual {v1, v0}, Lcom/oppo/camera/ParameterManager;->setJpegQuality(I)V
.line 1347
const-string v1, "CameraProcessManager"
new-instance v2, Ljava/lang/StringBuilder;
invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V
const-string v3, "setCaptureJpegOrientationAndQuality(),mJpegRotation:"
invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v2
iget v3, p0, Lcom/oppo/camera/CameraProcessManager;->mJpegRotation:I
invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v2
const-string v3, " jpegQuality:"
invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v2
invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v2
invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v2
invoke-static {v1, v2}, Landroid/util/Log;->v(Ljava/lang/String;Ljava/lang/String;)I
.line 1348
return-void
.line 1342
.end local v0 # "jpegQuality":I
:cond_0
iget v1, p0, Lcom/oppo/camera/CameraProcessManager;->mCameraId:I
const/4 v2, 0x2
invoke-static {v1, v2}, Landroid/media/CameraProfile;->getJpegEncodingQualityParameter(II)I
move-result v0
.restart local v0 # "jpegQuality":I
goto :goto_0
.end method
这里是相应的java代码(我知道我无法编辑由smali制作的java代码,遗憾的是,这会更容易) 来自dex2jar:
public void setCaptureJpegOrientationAndQuality(int paramInt)
{
this.mJpegRotation = paramInt;
if (this.mbBurstShot) {}
for (paramInt = 75;; paramInt = CameraProfile.getJpegEncodingQualityParameter(this.mCameraId, 2))
{
this.mParameterManager.setRotation(this.mJpegRotation);
this.mParameterManager.setJpegQuality(paramInt);
Log.v("CameraProcessManager", "setCaptureJpegOrientationAndQuality(),mJpegRotation:" + this.mJpegRotation + " jpegQuality:" + paramInt);
return;
}
}
这是Virtuous Ten Studio的另一个观点:
public void setCaptureJpegOrientationAndQuality(int i)
{
mJpegRotation = i;
int j;
if (mbBurstShot)
j = 100;
else
j = CameraProfile.getJpegEncodingQualityParameter(mCameraId, 2);
mParameterManager.setRotation(mJpegRotation);
mParameterManager.setJpegQuality(j);
Log.v("CameraProcessManager", (new StringBuilder()).append("setCaptureJpegOrientationAndQuality(),mJpegRotation:").append(mJpegRotation).append(" jpegQuality:").append(j).toString());
}
我想保持jpegorentation设置但是将jpegquality改为100%
如果有人能够帮助我并给出一些解释,请提前多多感谢=)
答案 0 :(得分:0)
解决方案是:
if burstmode (v0) = 100% (.line 1340 const/16 v0, 0x64)
if other mode (v1) = cond0 (end of the public method)
所以我不得不将cond0
值替换为:
.line 1340 const/16 v0, 0x64
它给出了:
.method public setCaptureJpegOrientationAndQuality(I)V
.locals 4
.param p1, "orientation" # I
.prologue
.line 1338
iput p1, p0, Lcom/oppo/camera/CameraProcessManager;->mJpegRotation:I
.line 1339
iget-boolean v1, p0, Lcom/oppo/camera/CameraProcessManager;->mbBurstShot:Z
if-eqz v1, :cond_0
.line 1340
const/16 v0, 0x64
.line 1345
.local v0, "jpegQuality":I
:goto_0
iget-object v1, p0, Lcom/oppo/camera/CameraProcessManager;->mParameterManager:Lcom/oppo/camera/ParameterManager;
iget v2, p0, Lcom/oppo/camera/CameraProcessManager;->mJpegRotation:I
invoke-virtual {v1, v2}, Lcom/oppo/camera/ParameterManager;->setRotation(I)V
.line 1346
iget-object v1, p0, Lcom/oppo/camera/CameraProcessManager;->mParameterManager:Lcom/oppo/camera/ParameterManager;
invoke-virtual {v1, v0}, Lcom/oppo/camera/ParameterManager;->setJpegQuality(I)V
.line 1347
const-string v1, "CameraProcessManager"
new-instance v2, Ljava/lang/StringBuilder;
invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V
const-string v3, "setCaptureJpegOrientationAndQuality(),mJpegRotation:"
invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v2
iget v3, p0, Lcom/oppo/camera/CameraProcessManager;->mJpegRotation:I
invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v2
const-string v3, " jpegQuality:"
invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v2
invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v2
invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v2
invoke-static {v1, v2}, Landroid/util/Log;->v(Ljava/lang/String;Ljava/lang/String;)I
.line 1348
return-void
.line 1342
.end local v0 # "jpegQuality":I
:cond_0
.line 1340
const/16 v0, 0x64
.restart local v0 # "jpegQuality":I
goto :goto_0
.end method