有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android smali edition:设置jpeg质量?

大家好,这里的开发者们

最近,我修改了ColorOS摄像头的一个端口,使其能够在我的设备(小米Mi4)上工作。 实际上,这个应用程序只适用于XML版本。但问题是,这个应用程序使用默认的安卓 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}, L安卓/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}, L安卓/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;
    }
  }

下面是德德十工作室的另一个观点:

    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());
    }

我希望保留JPEG定位设置,但将JPEG质量更改为始终100%

如果有人能够帮助我并给出一些解释,请提前多谢=)


共 (1) 个答案

  1. # 1 楼答案

    解决方案是:

    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