图片饱和度,色相,亮度调整

改变图片颜色,会让图片更具灵活性和趣味性,那我们通常在修改图片的像素色差时,如何实现呢?
效果图:

饱和度:
这里写图片描述

色相:
这里写图片描述

亮度:
这里写图片描述

OK,看完效果了,那么我们就用最简单的方式实现这几种有逼格的效果吧:
xml布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/showview_iv"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:scaleType="fitXY"
        android:src="@drawable/img_3" />

    <TextView
        android:id="@+id/progress_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/showview_iv"
        android:layout_marginLeft="200dp"
        android:layout_marginTop="30dp"
        android:text="50" />

    <TextView
        android:id="@+id/baoheduText_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/progress_tv"
        android:text="饱和度:" />

    <SeekBar
        android:id="@+id/baohedu_seekbar"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:layout_below="@+id/progress_tv"
        android:layout_toRightOf="@+id/baoheduText_tv"
        android:max="100"
        android:progress="50" />

    <TextView
        android:id="@+id/sexiangText_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/baoheduText_tv"
        android:layout_marginTop="10dp"
        android:text="    色相:" />

    <SeekBar
        android:id="@+id/sexiang_seekbar"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:layout_below="@+id/baoheduText_tv"
        android:layout_marginTop="10dp"
        android:layout_toRightOf="@+id/sexiangText_tv"
        android:max="100"
        android:progress="50" />

    <TextView
        android:id="@+id/liangduText_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/sexiangText_tv"
        android:layout_marginTop="10dp"
        android:text="    亮度:" />

    <SeekBar
        android:id="@+id/liangdu_seekbar"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:layout_below="@+id/sexiangText_tv"
        android:layout_marginTop="10dp"
        android:layout_toRightOf="@+id/liangduText_tv"
        android:max="100"
        android:progress="50" />

</RelativeLayout>

在activity中:

public class RecPictrueActivity extends Activity {

    private ImageView showview_iv;
    private TextView progress_tv;
    private SeekBar baohedu_seekbar, sexiang_seekbar, liangdu_seekbar;

    // 用于颜色变换的矩阵,android位图颜色变化处理主要是靠该对象完成
    private ColorMatrix mSaturationMatrix = new ColorMatrix();//饱和度
    private ColorMatrix mHueMatrix = new ColorMatrix();//色相
    private ColorMatrix mLightnessMatrix = new ColorMatrix();//亮度

    private ColorMatrix mAllMatrix = new ColorMatrix();

    /**
     * 饱和度
     */
    private float mSaturationValue = 0F;
    /**
     * 色相
     */
    private float mHueValue = 0F;
    /**
     * 亮度
     */
    private float mLightnessValue = 1F;

    //运算像素和颜色值的比例,是最大值的1/2
    private final int MIDDLE_VALUE = 50;

    //原始图片
    Bitmap srcBitmap = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_baohedu_layout);

        showview_iv = (ImageView) findViewById(R.id.showview_iv);
        srcBitmap = ((BitmapDrawable) showview_iv.getDrawable()).getBitmap();

        progress_tv = (TextView) findViewById(R.id.progress_tv);
        baohedu_seekbar = (SeekBar) findViewById(R.id.baohedu_seekbar);
        sexiang_seekbar = (SeekBar) findViewById(R.id.sexiang_seekbar);
        liangdu_seekbar = (SeekBar) findViewById(R.id.liangdu_seekbar);

        addListener(baohedu_seekbar, sexiang_seekbar, liangdu_seekbar);
    }

    private void addListener(SeekBar... seekbars) {
        for (SeekBar seekbar : seekbars)
            seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                    switch (seekBar.getId()) {
                        case R.id.baohedu_seekbar:
                            //饱和度表现为距离色轮中心的距离
                            //颜色相对于所选像素的起始颜色值,从色轮中心向外移动,或从外向色轮中心移动。数值的范围可以从 -100 到 +100。
                            mSaturationValue = (float) (i * 1.0D / MIDDLE_VALUE);
                            //饱和度
                            mSaturationMatrix.reset();
                            mSaturationMatrix.setSaturation(mSaturationValue);
                            break;
                        case R.id.sexiang_seekbar:
                            //色相表现为色轮的旋转角度,正值表示顺时针旋转,负值表示逆时针旋转
                            //正值表示顺时针旋转,负值表示逆时针旋转。数值的范围可以从 -180 到 +180。
                            mHueValue = (float) ((i - MIDDLE_VALUE) * 1.0D / MIDDLE_VALUE * 180);
                            mHueMatrix.reset();
                            mHueMatrix.setRotate(0, mHueValue); // 控制让红色区在色轮上旋转hueColor葛角度
                            mHueMatrix.setRotate(1, mHueValue); // 控制让绿红色区在色轮上旋转hueColor葛角度
                            mHueMatrix.setRotate(2, mHueValue); // 控制让蓝色区在色轮上旋转hueColor葛角度
                            break;
                        case R.id.liangdu_seekbar:
                            //明亮度则表现为RGB各分量的大小,0表示最暗,255表示最亮
                            mLightnessValue = (float) (i * 1.0D / MIDDLE_VALUE);
                            mLightnessMatrix.reset();
                            // 红、绿、蓝三分量按相同的比例,最后一个参数1表示透明度不做变化,此函数详细说明参考
                            mLightnessMatrix.setScale(mLightnessValue, mLightnessValue, mLightnessValue, 1);
                            break;
                    }

                    Bitmap bitmap = resetPictrue();
                    showview_iv.setImageBitmap(bitmap);
                    progress_tv.setText(i + "");
                }

                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {

                }

                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {

                }
            });
    }

    public Bitmap resetPictrue() {
        mAllMatrix.reset();
        // 效果叠加
        mAllMatrix.postConcat(mSaturationMatrix);
        mAllMatrix.postConcat(mHueMatrix);
        mAllMatrix.postConcat(mLightnessMatrix);

        Bitmap bmp = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), Bitmap.Config.ARGB_8888);
        // 创建一个相同尺寸的可变的位图区,用于绘制调色后的图片
        Canvas canvas = new Canvas(bmp); // 得到画笔对象
        Paint paint = new Paint(); // 新建paint
        paint.setAntiAlias(true); // 设置抗锯齿,也即是边缘做平滑处理
        paint.setColorFilter(new ColorMatrixColorFilter(mAllMatrix));// 设置颜色变换效果
        canvas.drawBitmap(srcBitmap, 0, 0, paint); // 将颜色变化后的图片输出到新创建的位图区
        // 返回新的位图,也即调色处理后的图片
        return bmp;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: opencv是一个开源的计算机视觉库,可以在Python中使用。通过使用opencv的色相饱和度转换功能,可以实现类似Photoshop中对图像进行色相饱和度调整。 首先,我们需要导入opencv库,并读取一张图片作为输入图像。可以使用cv2.imread()函数来读取图像。 接下来,我们可以通过调用cv2.cvtColor()函数来将图像转换为HSV色彩空间。HSV颜色模型由色调(Hue),饱和度(Saturation)和亮度(Value)组成。我们只需要调整色调和饱和度,所以我们将图像转换为HSV色彩空间。 然后,我们可以通过使用cv2.convertScaleAbs()函数来调整色相饱和度的值。该函数有三个参数,分别是输入图像、输出图像和缩放因子。我们可以将缩放因子设置为一个小数,以调整图像的色相饱和度。 最后,我们可以使用cv2.cvtColor()函数将图像转换回BGR颜色空间,然后可以使用cv2.imshow()函数显示调整后的图像。 下面是一个简单的示例代码: ```python import cv2 # 读取输入图像 image = cv2.imread('image.jpg') # 将图片转换为HSV颜色空间 hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 调整色相饱和度的值 hue_scale = 0.5 # 色相缩放因子 saturation_scale = 1.5 # 饱和度缩放因子 # 调整色相饱和度的值 hsv_image[:,:,0] = cv2.convertScaleAbs(hsv_image[:,:,0], alpha=hue_scale) hsv_image[:,:,1] = cv2.convertScaleAbs(hsv_image[:,:,1], alpha=saturation_scale) # 将图片转换回BGR颜色空间 new_image = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2BGR) # 显示调整后的图像 cv2.imshow('Adjusted Image', new_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这个示例代码中,我们将色相缩放因子设为0.5,饱和度缩放因子设为1.5。你可以根据自己的需要调整这两个值来得到不同的效果。调整后的图像会在一个新的窗口中显示出来。 这样,我们就可以通过opencv和Python来实现简单的色相饱和度调整,类似于Photoshop中的功能。 ### 回答2: 要使用OpenCV和Python实现Photoshop中的色相饱和度功能,可以按照以下步骤进行: 1. 导入必要的库:使用`import cv2`导入OpenCV库。 2. 加载图像:使用`cv2.imread()`函数加载要处理的图像。 3. 转换颜色空间:将加载的图像转换为HSV颜色空间,以便可以对色相饱和度进行调整。使用`cv2.cvtColor()`函数将图像从BGR颜色空间转换为HSV颜色空间。 4. 调整色相饱和度:使用`cv2.cvtColor()`函数的第三个参数来调整色相饱和度。该参数的取值范围为[-180, 180],其中负值表示减少色相饱和度,正值表示增加色相饱和度。 5. 转换颜色空间:将调整后的图像转换回BGR颜色空间,以便显示或保存。使用`cv2.cvtColor()`函数将图像从HSV颜色空间转换为BGR颜色空间。 6. 显示或保存结果:使用`cv2.imshow()`函数显示调整后的图像,并使用`cv2.waitKey()`函数等待用户按下键盘上的任意键。或使用`cv2.imwrite()`函数将调整后的图像保存到文件中。 7. 释放资源:使用`cv2.destroyAllWindows()`函数释放窗口和图像资源。 以下是一个示例代码来实现上述步骤: ```python import cv2 # 加载图像 image = cv2.imread('input.jpg') # 转换颜色空间为HSV hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 调整色相饱和度 hsv_image[..., 0] += 30 # 增加色相 hsv_image[..., 1] *= 1.5 # 增加饱和度 # 转换颜色空间为BGR adjusted_image = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2BGR) # 显示调整后的图像 cv2.imshow('Adjusted Image', adjusted_image) cv2.waitKey(0) # 保存调整后的图像 cv2.imwrite('output.jpg', adjusted_image) # 释放资源 cv2.destroyAllWindows() ``` 这段示例代码实现了将输入图像的色相增加30度,饱和度增加1.5倍的效果。您可以根据实际需求调整这两个参数来实现不同的色相饱和度调整效果。 ### 回答3: 要使用OpenCV在Python中实现Photoshop的色相饱和度功能,你需要按照以下步骤进行操作: 1. 导入所需的库和模块: ```python import cv2 import numpy as np ``` 2. 读取图像: ```python image = cv2.imread("your_image.jpg") ``` 3. 将图像转换为HSV颜色空间: ```python hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) ``` 4. 调整色相饱和度参数: ```python hue_shift = 30 # 色相偏移量(取值范围:-180到180) saturation_factor = 1.5 # 饱和度增强因子(取值范围:0到正无穷) hsv_image[:, :, 0] = (hsv_image[:, :, 0] + hue_shift) % 180 hsv_image[:, :, 1] = hsv_image[:, :, 1] * saturation_factor ``` 5. 将修改后的图像转换回BGR颜色空间: ```python result_image = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2BGR) ``` 6. 显示和保存结果图像: ```python cv2.imshow("Result Image", result_image) cv2.imwrite("result_image.jpg", result_image) cv2.waitKey(0) ``` 通过以上步骤,你可以使用OpenCV和Python实现类似Photoshop的色相饱和度功能。根据需要,你可以调整色相饱和度的参数来得到不同的效果。记得根据自己的实际情况修改读取和保存图像的路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值