Re: [Lcms-user] cmsDoTransform & visual basic
An ICC-based CMM for color management
Brought to you by:
mm2
From: <ma...@li...> - 2003-02-20 16:28:39
|
Hi, If you are going to use _same transform_ all time, that is, same input and output profiles, then you can speedup a lot the precess, since there is a heavy time penalty on transform creation. The procedure you outline is correct *except* you missed DIB are DWORD aligned, and this means you cannot transform whole DIB at time because there could be some padding on scanline ending. The solution is just to transform scanline by scanline instead doing whole image. a for() loop is all you need, and the overhead is practically null. Otherwise, your code would work only on images that are of multiple of 4. Regards,Martí Maria The little cms project http://www.littlecms.com ma...@li... ----- Original Message ----- From: "Isaac Chapman" <is...@th...> To: <lcm...@li...> Sent: Wednesday, February 19, 2003 5:02 AM Subject: [Lcms-user] cmsDoTransform & visual basic > I'm trying to create a windows application in vb that automatically scans an > image, applies a profile (the intended scanners are very quick, but not very > color accurate unless they scan CMYK which is much slower), saves it as a > tiff in a temp directory, and opens it in photoshop. I had every aspect of > the application functioning properly using TiffICC.exe to apply a profile > after it had already been saved, but as this application will be used tens > of thousands of times, usually in a batch of ~100 times, I was trying to > improve performance by performing the transformation from within the > application (That and I'm not comfortable having vb manipulate the tiff when > it is just making an educated guess as to when TiffICC.exe is finished with > the transformation.) > > I basically want a function that will take a handle to the scanned DIB and > the path to the profile to be used and return the handle to the transformed > DIB. I keep getting errors such as 'The memory could not be "written".', > 'The memory could not be "read".', Illegal Exception Errors, or the visual > basic IDE just crashes and disappears when the cmsDoTransform is called in > the code below. It functions fine until that point. > > Is there something I'm missing or doing completely wrong? This seems (to me > at least) to be the right way to go about doing this in visual basic, but > I'm about to start pulling my hair out. Alterations I've been unsuccessful > with: > Using the same DIB handle for both input and output buffers. > Changing the byte size of the transform buffer. > Kicking my computer :) > > On a more optimistic note, many thanks for all the work that has been put > into littlecms. JpegICC in particular has already transformed thousands of > non-color corrected images for me. > > -Isaac Chapman > Db Admin/Webmaster > Theme Co-op Promotions > is...@th... > > VB Code: > Option Explicit > > Public Enum cmsIntent > cmsPerceptual = 0 > cmsRelativeColorimetric = 1 > cmsSaturation = 2 > cmsAbsoluteColorimetric = 3 > End Enum > Public Const lTYPE_BGR_8 As Long = 263193 > Public Declare Function cmsCreate_sRGBProfile Lib "lcms.dll" () As Long > Public Declare Function cmsOpenProfileFromFile Lib "lcms.dll" _ > (ByVal sProfilePath As String, ByVal sAccess As String) As Long > Public Declare Function cmsCloseProfile Lib "lcms.dll" _ > (ByVal lProfileHandle As Long) As Boolean > Public Declare Function cmsCreateTransform Lib "lcms.dll" _ > (ByVal lInputProfile As Long, ByVal lInputFormat As Long, _ > ByVal lOutputProfile As Long, ByVal lOutputFormat As Long, _ > ByVal iIntent As Integer, ByVal lFlags As Long) As Long > Public Declare Function cmsDoTransform Lib "lcms.dll" _ > (ByVal lTransformHandle As Long, ByVal lInputBuffer As Long, _ > ByVal lOutputBuffer As Long, ByVal lSize As Long) > Public Declare Function cmsDeleteTransform Lib "lsms.dll" _ > (ByVal lTransformHandle As Long) > > Public Function TransformDib(lDibHandle As Long, lDibSize As Long, _ > sInputProfilePath As String) As Long > > Dim lInputProfile As Long > Dim lOutputProfile As Long > Dim lTransformHandle As Long > Dim lOutputDib As Long > > ' Open/Create Profiles > lInputProfile = cmsOpenProfileFromFile(sInputProfilePath, "r") > lOutputProfile = cmsCreate_sRGBProfile > > ' Create Transform > lTransformHandle = cmsCreateTransform(lInputProfile, lTYPE_BGR_8, _ > lOutputProfile, lTYPE_BGR_8, cmsPerceptual, 0) > > ' Allocate memory for the output DIB > lOutputDib = GlobalAlloc(GHND, lDibSize) > > ' Apply the transform > cmsDoTransform lTransformHandle, lDibHandle, lOutputDib, lDibSize > > ' Clean Up > cmsDeleteTransform lTransformHandle > cmsCloseProfile lInputProfile > cmsCloseProfile lOutputProfile > > ' Return the handle to the transformed DIB > TransformDib = lOutputDib > End Function > > > > ------------------------------------------------------- > This SF.net email is sponsored by: SlickEdit Inc. Develop an edge. > The most comprehensive and flexible code editor you can use. > Code faster. C/C++, C#, Java, HTML, XML, many more. FREE 30-Day Trial. > www.slickedit.com/sourceforge > _______________________________________________ > Lcms-user mailing list > Lcm...@li... > https://lists.sourceforge.net/lists/listinfo/lcms-user > > |