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