GPUImageView setImage(растровое изображение) не работает правильно во второй раз

Я разрабатываю приложение Photo, и я использую Android GPUImageView для редактирования изображений. Я хочу использовать несколько фильтров. XML-часть похожа на

<FrameLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1">

            <jp.co.cyberagent.android.gpuimage.GPUImageView
                android:id="@+id/gpuimage"
                android:layout_gravity="center"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scaleType="fitXY" />

            <SeekBar
                android:id="@+id/seekBar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom"
                android:max="100" />
        </FrameLayout>

Если я использую фильтр яркости, измените значение с помощью панели поиска и покажите предварительный просмотр за раз, как в следующий раз, как я могу использовать фильтр резкости на отфильтрованном изображении. Я установил растровое изображение моей фотографии как

mGPUImageView.setImage(bitmapPhoto).

После использования фильтра получите растровое изображение фотографии как

Bitmap bitmapSharpness = mGPUImageView.getGPUImage().getBitmapWithFilterApplied();

Но проблема в том, что если я хотел установить для bitmapSharpness значение GPUImageView, фильтрованный цвет искажается.

mGPUImageView.setImage(bitmapSharpness);

то есть. предварительный просмотр резкости отфильтрованного цвета и затем снова setTmage для цвета mGPUImageView не то же самое. В чем проблема??

3 ответа

Вы использовали GPUImageFilterGroup? как это:

GPUImageFilterGroup mFilterGroup = new GPUImageFilterGroup();
mFilterGroup.addFilter(brightnessFilter);
mFilterGroup.addFilter(sharpnessFilter);
mGpuImage.setFilter(mFilterGroup);

В GPUImageViewк нему уже применен фильтр. Если вы установите отфильтрованный вывод, он также применит этот фильтр к отфильтрованному выводу для рендеринга. Чтобы увидеть вновь установленное растровое изображение без изменений, можно применить следующий код:

mGPUImageView.setFilter(new GPUImageFilter());

Я страдал от той же проблемы, но нигде не нашел решения, и я не знаю, почему владелец git не решает эту проблему, но я нашел другой способ установки изображения в GPUImageView, и вот решение

Я создал GPUImageView без предварительного просмотра, и каждый раз, когда мне нужно изменить изображение, я просто удаляю старый gpuImageView и создаю новый, подобный этому

      public void onShow() {
        if(gpuImageViewConstraintLayout.getChildCount() > 0){
            gpuImageViewConstraintLayout.removeAllViews();
        }
//        creating new GPUImageView and add layout manager in gpuImageView
        gpuImageView = new GPUImageView(activity);
        ConstraintLayout.LayoutParams layoutParams = new ConstraintLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        gpuImageView.setLayoutParams(layoutParams);

//        create Group filter list
        filterList = createFilterList();
        gpuImageFilterGroup = new GPUImageFilterGroup(filterList);

//        set image in gpuImage view
        gpuImageView.setImage(activity.getMainBit());

//        set group Filter in gpuImageView
        gpuImageView.setFilter(gpuImageFilterGroup);

//        add gpuImageView in gpuImageViewConstraintLayout
        gpuImageViewConstraintLayout.addView(gpuImageView);

//        change the visibility of gpuImageViewConstraintLayout
        gpuImageViewConstraintLayout.setVisibility(View.VISIBLE);

//        request render
        gpuImageView.requestRender();

//        other functionality
         ....................
         ..........
         ..............
    }

public List<GPUImageFilter> createFilterList() {
        List<GPUImageFilter> filters = new ArrayList<GPUImageFilter>();
        filters.add(BRIGHTNESS_GROUP_FILTER_ITEM_NUMBER, new GPUImageBrightnessFilter(0.0f));
        filters.add(CONTRAST_GROUP_FILTER_ITEM_NUMBER, new GPUImageContrastFilter(1.0f));
        filters.add(SATURATION_GROUP_FILTER_ITEM_NUMBER, new GPUImageSaturationFilter(1.0f));
        filters.add(SHARPNESS_GROUP_FILTER_ITEM_NUMBER, new GPUImageSharpenFilter(0.0f));
        filters.add(SOFTNESS_GROUP_FILTER_ITEM_NUMBER, new GPUImageGaussianBlurFilter(0.0f));
        filters.add(TEMPERATURE_GROUP_FILTER_ITEM_NUMBER, new GPUImageTemperatureFilter(0.0f));
        filters.add(TINT_GROUP_FILTER_ITEM_NUMBER, new GPUImageTintFilter(0.0f));
        filters.add(VIBRANCE_GROUP_FILTER_ITEM_NUMBER, new GPUImageVibranceFilter(0.0f));
        filters.add(HUE_GROUP_FILTER_ITEM_NUMBER, new GPUImageHueFilter(0.0f));
        filters.add(WHITE_BALANCE_GROUP_FILTER_ITEM_NUMBER, new GPUImageWhiteBalanceFilter(5000.0f, 0.0f));
        return filters;
    }

Надеюсь, это будет полезно. вот ссылка на проблему с git и мое решение -> https://github.com/cats-oss/android-gpuimage/issues/381

Другие вопросы по тегам