Android smali edition: установить качество jpeg?

Привет разработчики здесь.

Недавно я модифицировал порт ColorOS Camera, чтобы он работал на моем устройстве (Xiaomi Mi4). На самом деле это приложение довольно хорошо работает только с версиями XML. Но дело в том, что это приложение использует сжатие jpeg для Android по умолчанию (качество jpeg = 85% в моем случае)

Я просто решил изменить файлы smali, чтобы изменить это. Я уже модифицировал пакетный режим для захвата jpeg со 100% качеством (изменил значение 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 (я знаю, что не могу редактировать код Java, сделанный из smali, к сожалению, это было бы проще) От 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, но изменить качество jpeg, чтобы оно всегда было 100%

Заранее большое спасибо, если кто-то сможет мне помочь и дать некоторые пояснения =)


person Riichard63    schedule 01.06.2015    source источник


Ответы (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
person Riichard63    schedule 01.06.2015