Skip to content
高超 edited this page Feb 26, 2019 · 1 revision

Image edit is an android library based on opengl es 2.0.

All editing action are performed by Operator.

Only two steps to edit image:

  1. create an operator.
  2. add to IEManager api class.

Add lut filter.

  1. create an operator
filterOp = new LookupFilterOperator.Builder()
                            .intensity(mCurFilter.mAdjust[0])
                            .lookup(BitmapFactory.decodeStream(LOOK_UP_TABLE_STREAM)
                            .build();
  1. add to IEManager api class
if (opAdded) {
    // you can render it right now.
    IEManager.getInstance().updateOperator(0, filterOp, true);
    // or render it later.
    IEManager.getInstance().updateOperator(0, filterOp, false);
} else {
    IEManager.getInstance().addOperator(0, filterOp, true);
}

Adjust image params

We take exposure adjustment as an example.

  1. create an operator
exposureOp = new ExposureAdjustOperator.Builder().build();
// adjust params in operator.
exposureOp.setExposure(EXPOSURE_VALUE);
  1. add it to IEManager api class.
if (opAdded) {
    // you can render it right now.
    IEManager.getInstance().updateOperator(0, exposureOp, true);
    // or render it later.
    IEManager.getInstance().updateOperator(0, exposureOp, false);
} else {
    IEManager.getInstance().addOperator(0, exposureOp, true);
}

We support following adjustment:

  1. Brightness
  2. Exposure
  3. Gamma
  4. Contrast
  5. Saturation
  6. Sharpness
  7. Dark corner
  8. Shadow & Highlight
  9. Color temperature
  10. Tone
  11. De-noise
  12. RGB value
  13. Color balance

Cut image

Just set a scissor rectangle:

// render it right later.
IEManager.getInstance().setScissorX(0, SCISSOR_X, false);
// render it right later.
IEManager.getInstance().setScissorY(0, SCISSOR_Y, false);
// render it right later.
IEManager.getInstance().setScissorWidth(0, SCISSOR_WIDTH, false);
// render it right now.
IEManager.getInstance().setScissorHeight(0, SCISSOR_HEIGHT, true);

Space transform image

  1. create an operator
transOp = new ModelViewOperator.Builder().build();
// set perspective
transOp.setPerspective(true);
// set rotate
transOp.setRotateX(degree);
transOp.setRotateY(degree);
transOp.setRotateZ(degree);
// set translate
transOp.setTranslateX(translate);
transOp.setTranslateY(translate);
transOp.setTranslateZ(translate);
  1. add it to IEManager
if (opAdded) {
    // you can render it right now.
    IEManager.getInstance().updateOperator(0, transOp, true);
    // or render it later.
    IEManager.getInstance().updateOperator(0, transOp, false);
} else {
    IEManager.getInstance().addOperator(0, transOp, true);
}

Add text

  1. create text operator
textOp = new TextOperator.Builder()
                                .text(text)
                                .color(1f, 1f, 1f)
                                .size(DEFAULT_TEXT_SIZE)
                                .font(FONT_FILE)
                                .position(mCurTextPosX, mCurTextPosY)
                                .build();
  1. add it to IEManager
if (opAdded) {
    // you can render it right now.
    IEManager.getInstance().updateOperator(0, textOp, true);
    // or render it later.
    IEManager.getInstance().updateOperator(0, textOp, false);
} else {
    IEManager.getInstance().addOperator(0, textOp, true);
}

Blur

  1. create an operator
// we can use 3 x 3/ 5 x5 sample operator to blur, and choose a good kernel.
blurOp = new ThreeXThreeSampleOperator.Builder()
                            .sampleKernel(ThreeXThreeSampleOperator.SIGMA_1_5_GAUSSIAN_SAMPLE_KERNEL)
                            .build();
  1. add it to IEManager
if (opAdded) {
    // you can render it right now.
    IEManager.getInstance().updateOperator(0, blurOp, true);
    // or render it later.
    IEManager.getInstance().updateOperator(0, blurOp, false);
} else {
    IEManager.getInstance().addOperator(0, blurOp, true);
}

Add sticker

  1. create an operator
stickerOp = new StickerOperator.Builder()
                    .sticker(STICKER_BITMAP)
                    .position(0.5f, 0.5f)
                    .build();
  1. add it to IEManager
if (opAdded) {
    // you can render it right now.
    IEManager.getInstance().updateOperator(0, stickerOp, true);
    // or render it later.
    IEManager.getInstance().updateOperator(0, stickerOp, false);
} else {
    IEManager.getInstance().addOperator(0, stickerOp, true);
}

Add mosaic

  1. create an operator
mosaicOp = new MosaicOperator.Builder()
                             .strength(STRENGTH_VALUE)
                             .build();
// add mosaic area
mosaicOp.addArea(CENTER_X, CENTER_Y);
// remove mosaic area
mosaicOp.removeArea(CENTER_X, CENTER_Y);
  1. add it to IEManager
if (opAdded) {
    // you can render it right now.
    IEManager.getInstance().updateOperator(0, mosaicOp, true);
    // or render it later.
    IEManager.getInstance().updateOperator(0, mosaicOp, false);
} else {
    IEManager.getInstance().addOperator(0, mosaicOp, true);
}

Video generate(MP4)

You can generate video from images, and add BGM!

  1. add images to IEManager as clip.
for (int i = 0; i < NUMBER_OF_IMAGE_FILES; i++) {
    // add this image, and it's shown duration is 3000 ms.
    IEManager.getInstance().addClip(IMAGE_FILE_PATH, 3000);
    mTotalDuration += 3000;
}
  1. you can add transition between clips.
IEManager.getInstance().setTransition(CLIP_INDEX, TRANSITION, TRANSITION_DURATION, RENDER_RIGHT_NOW);
  1. seek to see effects.
IEManager.getInstance().seek((long) (IEManager.getInstance().getTotalDuration() * PROGRESS));
  1. save as video file.
IEManager.getInstance().saveAsVideo(
                        VIDEO_WIDTH,
                        VIDEO_HEIGHT,
                        ORIENTATION,
                        OUTPUT_MP4_FILE,
                        BGM_FILE_PATH,
                        BGM_START_TIME,
                        new SaveListener() {
                            @Override
                            public void onSaveFailed() {
                                // save failed.
                            }

                            @Override
                            public void onSaveProgress(float progress) {
                                // notify save progress.
                            }

                            @Override
                            public void onSaved(File target) {
                                // video save done.
                            }
                        }
                );
Clone this wiki locally