Welcome, guest! Login / Register - Why register?
Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)

Paste

Pasted as C++ by ASD ( 15 years ago )
#include "cmRGBtoHSL.h"

#include <mmStringUtilities.h>
#include <mmInterfaceInitializers.h>
#include <mmOperatingSystemCalls.h>
#include <math.h>

mmImages::cmRGBtoHSL::cmRGBtoHSL(mmMemory::mmMemoryManagerI* p_psMemoryManager,
                mmLog::mmLogReceiverI* p_psLogReceiver):
                mmCalcMethodI(p_psMemoryManager, 
                       p_psLogReceiver, 
                       mmString(L"cmRGBtoHSL"))
{
 swprintf(m_sCMParams.sShortName, L"MM: RGB to HSL method");
 swprintf(m_sCMParams.sIDName, L"{2E80D65A-8877-4920-AEF5-770EDB476C56}");
 swprintf(m_sCMParams.sDescription,L"Transforms RGB color model to HSL");
 m_sCMParams.bIsMultithreaded = false;

 // put members initialization code here

 // put parameters definition here

 UpdateParameters();
}

mmImages::cmRGBtoHSL::~cmRGBtoHSL()
{
}

bool mmImages::cmRGBtoHSL::Calculate()
{
 mmInt width;
 mmInt height;
 mmInt channelCount; // how many channels
 mmInt pixelCount; //how many pixels to calculate PER CHANNEL (width * height)
 mmInt picID = 0; //picture's ID

 mmInt layID[3]; //layers ID
 for(int i=0; i<3;i++)
 {
  layID[i] = 0;
 }
 mmString layName[3] = {L"H",  L"S", L"L"}; //layers names
 for(int i=0; i<3;i++)
 {
  m_psImagesStructure->LockAllDataForWrite();
  layID[i] = m_psImagesStructure->GetDataLayerID(layName[i]);
  if(!(layID[i]>-1)) layID[i] = m_psImagesStructure->AddNewDataLayer(layName[i], 0.0);
  m_psImagesStructure->UnlockAllDataFromWrite();
 }
 bool flagR[3]={1, 0, 0}; //RGB flags
 bool flagG[3]={0, 1, 0};
 bool flagB[3]={0, 0, 1};
 

 for(int i=0;i<m_psImagesStructure->GetImagesCount();++i) //perform for all immages
 {
  m_psImagesStructure->LockAllDataForRead();
  m_psImagesStructure->GetImageParameters(i, &width;, &height;, &channelCount;); //get params
  pixelCount=height*width; //amount of pixels in single channel
  //get RGB info
  mmReal* R = new mmReal[pixelCount];
  m_psImagesStructure->GetPixels(i, 0, pixelCount, flagR, R, NULL);
  mmReal* G = new mmReal[pixelCount];
  m_psImagesStructure->GetPixels(i, 0, pixelCount, flagG, G, NULL);
  mmReal* B = new mmReal[pixelCount];
  m_psImagesStructure->GetPixels(i, 0, pixelCount, flagB, B, NULL);
  m_psImagesStructure->UnlockAllDataFromRead();
  //creating new layers to store transformed RGB values
  mmReal * H = new mmReal[pixelCount];
  mmReal * S = new mmReal[pixelCount];
  mmReal * L = new mmReal[pixelCount];
  
  //RGB to HSL transformation algorithm
  mmReal r,g,b;
  mmReal m = 255.0;
  mmReal M = 0.0;
  for(int j=0; j<pixelCount; j++)
  {
   r=R[j]/255.0;
   g=G[j]/255.0;
   b=B[j]/255.0;
   //finding min and max rgb values
   m=r;
   M=r;
   if(g<m) m=g;
   else if(g>M) M=g;
   if(b<m) m=b;
   else if(b>M) M=b;

   L[j] = (m+M)/2;
   if(m==M){
    H[j]=0; 
    S[j]=0;
    continue;
   }
   if(L[j] < 0.5){
    S[j]=(M-m)/(M+m);
   }else{
    S[j]=(M-m)/(2.0-M-m);
   }
   if(r==M) H[j] = (g-b)/(M-m);
   if(g==M) H[j] = 2.0 + (b-r)/(M-m);
   if(b==M) H[j] = 4.0 + (r-g)/(M-m);
   
   H[j] = H[j]*60.0;
   if(H[j]<0) H[j] += 360.0;
   //r=R[j]/255.0;
   //g=G[j]/255.0;
   //b=B[j]/255.0;
   //
   //m = min(r,min(g,b));
   //M = max(r,max(g,b));
   ////if(r < m) min = r;
   ////else if(r > max) max = r;
   ////if(g < min) min = g;
   ////else if(g > max) max = g;
   ////if(b < min) min = b;
   ////else if(b > max) max = b;

   //L[j] = (m + M)/2; //getting L
   //if(m == M) //Chroma = 0 case
   //{
   // H[j]=0; 
   // S[j]=0; 
   //}
   //else
   //{
   // if(L[j] < 0.5)
   // {
   //  S[j]=(M - m)/(2 * L[j]);
   // }
   // else
   // {
   //  S[j]=(M - m)/(2.0 - 2*L[j]);
   // }
   // if(r == M) H[j] = fmod((g - b)/(M - m),6);
   // if(g == M) H[j] = 2.0 + (b - r)/(M - m);
   // if(b == M) H[j] = 4.0 + (r - g)/(M - m);
   //
   // H[j] = H[j]*60.0;
   // if(H[j]<0) H[j] += 360.0;
   //}   
  }
  m_psImagesStructure->LockAllDataForWrite();
  m_psImagesStructure->SetPointsAdditionalDataLayerCoord(i, 0, pixelCount, layID[0], H);
  m_psImagesStructure->SetPointsAdditionalDataLayerCoord(i, 0, pixelCount, layID[1], S);
  m_psImagesStructure->SetPointsAdditionalDataLayerCoord(i, 0, pixelCount, layID[2], L);
  m_psImagesStructure->UnlockAllDataFromWrite();

  delete [] R, G, B, H, S, L;
 }
 
 return true;
}

void mmImages::cmRGBtoHSL::ExecBeforeSingleImageCalc(mmInt p_iCurrentImageID)
{
 // put code which runs before every image calculation here
}

void mmImages::cmRGBtoHSL::ExecAfterSingleImageCalc(mmInt p_iCurrentImageID)
{
 // put code which runs after every image calculation here
}

void mmImages::cmRGBtoHSL::RetrieveParameters()
{
 // update parameters value here after their change by the user
}

 

Revise this Paste

Your Name: Code Language: