Từ 1 tới 7 trên tổng số 7 kết quả

Đề tài: [VS C++6] Cho hỏi việc tăng giảm độ sáng của ảnh

  1. #1
    No Avatar
    tuvonc Khách

    Red face [VS C++6] Cho hỏi việc tăng giảm độ sáng của ảnh

    Các bác cao thủ cho em hỏi , em trong VS C++6.0 em muốn tăng giảm độ sáng của ảnh phải làm sao, em có thể làm tăng giảm độ sáng của ảnh nhưng nó không giảm (tăng) từ từ mà chỉ giảm (tăng) 1 lần thôi hix

  2. #2
    Ngày gia nhập
    10 2006
    Nơi ở
    Hà Nội
    Bài viết
    146

    Vậy bạn thử dùng vòng lặp for với độ delay thời gian bao nhiêu đó...Chắc nó sẽ như ý bạn muốn.

  3. #3
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    Ngoài lề :

    Công lực còn kém nên không biết có hàm tăng/giảm độ sáng hay ko ( chắc DirectX có ). Nhưng có thể tăng sáng cho từng điểm của ảnh. Chỉ cần cộng thêm một hằng số vào các giá trị màu RGB của nó là OK. Ví dụ màu RGB(100,125,139) , tăng độ sáng lên một chút ( + 20 ) sẽ là RGB(120,145,159).

    Nếu muốn invert ảnh thì cũng tương tự ( tức là invert từng điểm một ). Để invert một điểm thì ta dùng RGB(255,255,255) trừ đi chính màu đó. Ví dụ, màu RGB(100,125,139) sẽ có invert là : RGB(255,255,255) - RGB(100,125,139) = RGB(155,130,111).

    Hy vọng sẽ có ích cho bạn
    pEnGwINUS.

  4. #4
    Ngày gia nhập
    11 2006
    Bài viết
    75
    Our dreams are young and we both know they take us where we want to go...

  5. #5
    Ngày gia nhập
    07 2006
    Bài viết
    166

    Câu hỏi của bạn không rõ ràng lắm, không biết là với ảnh màu hay ảnh đa mức xám (nhiều người vẫn gọi là ảnh đen trắng). Với ảnh đa mức xám thì chỉ việc tăng giá trị ma trận điểm ảnh lên thôi. Còn với ảnh màu thì hàm mức xám được tính bằng công thức:
    mức xám = 0.59R + 0.3G + 0.11B => tăng thành phần nào cũng làm tăng mức xám Vấn đề là bạn phải xem xem tăng cách nào (tăng đều hay tăng 1, 2 thành phần)

  6. #6
    No Avatar
    thandongdatviet Khách

    Mặc định [VS C++6] Cho hỏi việc tăng giảm độ sáng của ảnh

    Chán quá,cái này yêu cầu Account,nên mình không thể logon được,bạn ilovecplusplus đã giúp thì giúp cho trót,làm ơn post cho xem code đi,được không?

  7. #7
    Ngày gia nhập
    11 2006
    Bài viết
    75

    Nó đòi Acc thì bác đăng ký (nút "Join" đó), kêu ca làm gì cho mệt. Với cả nó chỉ yêu cầu mỗi địa chỉ email thôi.

    Một trang web hay như thế mà bác không đăng ký thì hơi bị "phí" đó.

    Dù sao tôi cũng post cho bác đoạn mã chính của ImagePreview:
    Code:
    // DialogBrightnessContrast.cpp : implementation file
    //
    
    #include "stdafx.h"
    #include <math.h>
    #include "DialogBrightnessContrast.h"
    
    // CDialogBrightnessContrast dialog
    
    IMPLEMENT_DYNAMIC(CDialogBrightnessContrast, CDialog)
    CDialogBrightnessContrast::CDialogBrightnessContrast(CWnd* pParent /*=NULL*/)
    	: CDialog(CDialogBrightnessContrast::IDD, pParent)
    	, m_nBrightness(100)
    	, nBrightness(0)
    	, m_nContrast(100)
    	, nContrast(0)
    	, m_bPreview(FALSE)
    {
    }
    
    CDialogBrightnessContrast::~CDialogBrightnessContrast()
    {
    	
    }
    
    void CDialogBrightnessContrast::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	DDX_Text(pDX, IDC_EDIT_BRIGHTNESS, nBrightness);
    	DDX_Slider(pDX, IDC_SLIDER_BRIGHTNESS, m_nBrightness);
    	DDX_Text(pDX, IDC_EDIT_CONTRAST, nContrast);
    	DDX_Slider(pDX, IDC_SLIDER_CONTRAST, m_nContrast);
    	DDV_MinMaxInt(pDX, nContrast, -100, 100);
    	DDV_MinMaxInt(pDX, nBrightness, -100, 100);
    	DDX_Check(pDX, IDC_CHECK_PREVIEW, m_bPreview);
    }
    
    
    BEGIN_MESSAGE_MAP(CDialogBrightnessContrast, CDialog)
    	ON_WM_HSCROLL()
    	ON_BN_CLICKED(IDC_CHECK_PREVIEW, OnBnClickedCheckPreview)
    	ON_EN_CHANGE(IDC_EDIT_BRIGHTNESS, OnEnChangeEdit)
    	ON_EN_CHANGE(IDC_EDIT_CONTRAST, OnEnChangeEdit)
    	ON_WM_PAINT()
    END_MESSAGE_MAP()
    
    
    // CDialogBrightnessContrast message handlers
    
    BOOL CDialogBrightnessContrast::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	CSliderCtrl * pSlider1 = (CSliderCtrl*)GetDlgItem(IDC_SLIDER_BRIGHTNESS);
    	pSlider1->SetRange(0, 200);
    	pSlider1->SetPos(100);
    	pSlider1->SetTicFreq(10);
    	pSlider1->SetTic(10);
    
    	CSliderCtrl * pSlider2 = (CSliderCtrl*)GetDlgItem(IDC_SLIDER_CONTRAST);
    	pSlider2->SetRange(0, 200);
    	pSlider2->SetPos(100);
    	pSlider2->SetTicFreq(10);
    	pSlider2->SetTic(10);
    
    	CPaintDC dc(this);
    
    	// I am loading from IDB_YY resource
    	// do some thing to get a sample from your full image here.
    	
    	// Source
    	m_bmSource.LoadBitmap(IDB_YY);
    	m_dcSource.CreateCompatibleDC(&dc);
    	m_dcSource.SelectObject(&m_bmSource);
    
    	// Off-Screen
    	m_bmOffScreen.LoadBitmap(IDB_YY);
    	m_dcOffScreen.CreateCompatibleDC(&dc);
    	m_dcOffScreen.SelectObject(m_bmOffScreen);
    	
    	m_bmSource.GetBitmap(&m_bmp);
    
    	UpdateData(FALSE);
    
    	return TRUE;  // return TRUE unless you set the focus to a control
    	// EXCEPTION: OCX Property Pages should return FALSE
    }
    
    void CDialogBrightnessContrast::OnOK()
    {
    	UpdateData(TRUE);
        CDialog::OnOK();
    }
    
    void CDialogBrightnessContrast::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
    {
    	UpdateData(TRUE);
    	nBrightness = m_nBrightness - 100;
    	nContrast = m_nContrast - 100;
    	UpdateData(FALSE);
    
    	BrightnessAndContrast();
    
    	CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
    }
    
    void CDialogBrightnessContrast::OnBnClickedCheckPreview()
    {
    	UpdateData(TRUE);
    }
    
    void CDialogBrightnessContrast::OnEnChangeEdit()
    {
    	UpdateData(TRUE);
    	m_nBrightness = nBrightness + 100;
    	m_nContrast = nContrast + 100;
    	UpdateData(FALSE);
    
    	BrightnessAndContrast();
    }
    
    void CDialogBrightnessContrast::OnPaint()
    {
    	CPaintDC dc(this); 
    	// I am doing it at 5, 5
    	// you can create a frame in the dialog resource and use that frame Rect here.
    	dc.BitBlt(5, 5, m_bmp.bmWidth, m_bmp.bmHeight, &m_dcOffScreen, 0, 0, SRCCOPY);
    }
    
    void CDialogBrightnessContrast::BrightnessAndContrast()
    {
    	const int GREY = 0x7f;	
    
    	int nStepB = (int)floor(nBrightness * 0.01 * GREY);
    	double dStepC = m_nContrast * 0.01;	
    
    	if (m_nContrast > 99) 
    	{
    		dStepC = dStepC * dStepC * dStepC;
    	}
    
    	TRACE("nBrightness(%d) Contrast(%f)\n", nStepB, dStepC );
    	
        for (m_nY = 0; m_nY < m_bmp.bmHeight; m_nY++) {
            for (m_nX = 0; m_nX < m_bmp.bmWidth; m_nX++) {
                m_crC = m_dcSource.GetPixel(m_nX, m_nY);
    
    			// RED
                m_nC = GetRValue(m_crC) + nStepB; // for brightness
    			m_nC = (int)floor((m_nC - GREY) * dStepC) + GREY; // for contrast
    			// add tint, invert.. whatever here 
    			m_nR = (m_nC < 0x00) ? 0x00 : (m_nC > 0xff) ? 0xff : m_nC;
    
    			// GREEN
                m_nC = GetGValue(m_crC) + nStepB;
                m_nC = (int)floor((m_nC - GREY) * dStepC) + GREY;
    			m_nG = (m_nC < 0x00) ? 0x00 : (m_nC > 0xff) ? 0xff : m_nC;
    
    			// BLUE
                m_nC = GetBValue(m_crC) + nStepB;
                m_nC = (int)floor((m_nC - GREY) * dStepC) + GREY;
    			m_nB = (m_nC < 0x00) ? 0x00 : (m_nC > 0xff) ? 0xff : m_nC;
    
                m_crC = m_nR + (m_nG << 8) + (m_nB << 16);
                m_dcOffScreen.SetPixel(m_nX, m_nY, m_crC);
            }
        }
    
        RedrawWindow(NULL, NULL, RDW_INVALIDATE);
    }
    Our dreams are young and we both know they take us where we want to go...

Các đề tài tương tự

  1. Bài tập C Thắc mắc về bài toán mảng tăng, giảm hay không tăng, không giảm
    Gửi bởi oracle95 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 10
    Bài viết cuối: 08-11-2013, 12:06 AM
  2. Thuật toán chuyển dãy tăng giảm thành dãy tăng?
    Gửi bởi anhtran trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 5
    Bài viết cuối: 12-03-2012, 07:40 AM
  3. Giải thuật về tăng/giảm độ tương phản của ảnh như thế nào?
    Gửi bởi cuipapknight trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 27-08-2011, 11:11 PM
  4. MS SQL Lỗi sắp xếp tăng dần nếu trùng thì sắp giảm giần
    Gửi bởi teodainhan trong diễn đàn Thắc mắc Microsoft SQL Server & Microsoft Access
    Trả lời: 2
    Bài viết cuối: 05-07-2011, 08:35 AM
  5. Tăng và giảm bằng 2 phím | Thuật toán tăng và giảm khi đếm số thứ tự từ 00 đến 99?
    Gửi bởi guitar_flamenco trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 09-05-2009, 05:59 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn