CN1452557A - 用于补偿喷墨打印头中喷嘴随时间变化发生错位的方法和装置 - Google Patents
用于补偿喷墨打印头中喷嘴随时间变化发生错位的方法和装置 Download PDFInfo
- Publication number
- CN1452557A CN1452557A CN00819578.1A CN00819578A CN1452557A CN 1452557 A CN1452557 A CN 1452557A CN 00819578 A CN00819578 A CN 00819578A CN 1452557 A CN1452557 A CN 1452557A
- Authority
- CN
- China
- Prior art keywords
- section
- adjacent
- nozzle
- const
- int
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- B—PERFORMING OPERATIONS; TRANSPORTING
- B41—PRINTING; LINING MACHINES; TYPEWRITERS; STAMPS
- B41J—TYPEWRITERS; SELECTIVE PRINTING MECHANISMS, i.e. MECHANISMS PRINTING OTHERWISE THAN FROM A FORME; CORRECTION OF TYPOGRAPHICAL ERRORS
- B41J2/00—Typewriters or selective printing mechanisms characterised by the printing or marking process for which they are designed
- B41J2/005—Typewriters or selective printing mechanisms characterised by the printing or marking process for which they are designed characterised by bringing liquid or particles selectively into contact with a printing material
- B41J2/01—Ink jet
- B41J2/015—Ink jet characterised by the jet generation process
- B41J2/04—Ink jet characterised by the jet generation process generating single droplets or particles on demand
- B41J2/045—Ink jet characterised by the jet generation process generating single droplets or particles on demand by pressure, e.g. electromechanical transducers
- B41J2/04501—Control methods or devices therefor, e.g. driver circuits, control circuits
- B41J2/04586—Control methods or devices therefor, e.g. driver circuits, control circuits controlling heads of a type not covered by groups B41J2/04575 - B41J2/04585, or of an undefined type
-
- B—PERFORMING OPERATIONS; TRANSPORTING
- B41—PRINTING; LINING MACHINES; TYPEWRITERS; STAMPS
- B41J—TYPEWRITERS; SELECTIVE PRINTING MECHANISMS, i.e. MECHANISMS PRINTING OTHERWISE THAN FROM A FORME; CORRECTION OF TYPOGRAPHICAL ERRORS
- B41J2/00—Typewriters or selective printing mechanisms characterised by the printing or marking process for which they are designed
- B41J2/005—Typewriters or selective printing mechanisms characterised by the printing or marking process for which they are designed characterised by bringing liquid or particles selectively into contact with a printing material
- B41J2/01—Ink jet
- B41J2/015—Ink jet characterised by the jet generation process
- B41J2/04—Ink jet characterised by the jet generation process generating single droplets or particles on demand
- B41J2/045—Ink jet characterised by the jet generation process generating single droplets or particles on demand by pressure, e.g. electromechanical transducers
- B41J2/04501—Control methods or devices therefor, e.g. driver circuits, control circuits
- B41J2/04505—Control methods or devices therefor, e.g. driver circuits, control circuits aiming at correcting alignment
-
- B—PERFORMING OPERATIONS; TRANSPORTING
- B41—PRINTING; LINING MACHINES; TYPEWRITERS; STAMPS
- B41J—TYPEWRITERS; SELECTIVE PRINTING MECHANISMS, i.e. MECHANISMS PRINTING OTHERWISE THAN FROM A FORME; CORRECTION OF TYPOGRAPHICAL ERRORS
- B41J2/00—Typewriters or selective printing mechanisms characterised by the printing or marking process for which they are designed
- B41J2/005—Typewriters or selective printing mechanisms characterised by the printing or marking process for which they are designed characterised by bringing liquid or particles selectively into contact with a printing material
- B41J2/01—Ink jet
- B41J2/015—Ink jet characterised by the jet generation process
- B41J2/04—Ink jet characterised by the jet generation process generating single droplets or particles on demand
- B41J2/045—Ink jet characterised by the jet generation process generating single droplets or particles on demand by pressure, e.g. electromechanical transducers
- B41J2/04501—Control methods or devices therefor, e.g. driver circuits, control circuits
- B41J2/04563—Control methods or devices therefor, e.g. driver circuits, control circuits detecting head temperature; Ink temperature
-
- B—PERFORMING OPERATIONS; TRANSPORTING
- B41—PRINTING; LINING MACHINES; TYPEWRITERS; STAMPS
- B41J—TYPEWRITERS; SELECTIVE PRINTING MECHANISMS, i.e. MECHANISMS PRINTING OTHERWISE THAN FROM A FORME; CORRECTION OF TYPOGRAPHICAL ERRORS
- B41J2/00—Typewriters or selective printing mechanisms characterised by the printing or marking process for which they are designed
- B41J2/005—Typewriters or selective printing mechanisms characterised by the printing or marking process for which they are designed characterised by bringing liquid or particles selectively into contact with a printing material
- B41J2/01—Ink jet
- B41J2/015—Ink jet characterised by the jet generation process
- B41J2/04—Ink jet characterised by the jet generation process generating single droplets or particles on demand
- B41J2/045—Ink jet characterised by the jet generation process generating single droplets or particles on demand by pressure, e.g. electromechanical transducers
- B41J2/04501—Control methods or devices therefor, e.g. driver circuits, control circuits
- B41J2/0459—Height of the driving signal being adjusted
-
- B—PERFORMING OPERATIONS; TRANSPORTING
- B41—PRINTING; LINING MACHINES; TYPEWRITERS; STAMPS
- B41J—TYPEWRITERS; SELECTIVE PRINTING MECHANISMS, i.e. MECHANISMS PRINTING OTHERWISE THAN FROM A FORME; CORRECTION OF TYPOGRAPHICAL ERRORS
- B41J2/00—Typewriters or selective printing mechanisms characterised by the printing or marking process for which they are designed
- B41J2/005—Typewriters or selective printing mechanisms characterised by the printing or marking process for which they are designed characterised by bringing liquid or particles selectively into contact with a printing material
- B41J2/01—Ink jet
- B41J2/135—Nozzles
- B41J2/145—Arrangement thereof
- B41J2/155—Arrangement thereof for line printing
-
- B—PERFORMING OPERATIONS; TRANSPORTING
- B41—PRINTING; LINING MACHINES; TYPEWRITERS; STAMPS
- B41J—TYPEWRITERS; SELECTIVE PRINTING MECHANISMS, i.e. MECHANISMS PRINTING OTHERWISE THAN FROM A FORME; CORRECTION OF TYPOGRAPHICAL ERRORS
- B41J2/00—Typewriters or selective printing mechanisms characterised by the printing or marking process for which they are designed
- B41J2/005—Typewriters or selective printing mechanisms characterised by the printing or marking process for which they are designed characterised by bringing liquid or particles selectively into contact with a printing material
- B41J2/01—Ink jet
- B41J2/21—Ink jet for multi-colour printing
- B41J2/2132—Print quality control characterised by dot disposition, e.g. for reducing white stripes or banding
- B41J2/2135—Alignment of dots
-
- B—PERFORMING OPERATIONS; TRANSPORTING
- B41—PRINTING; LINING MACHINES; TYPEWRITERS; STAMPS
- B41J—TYPEWRITERS; SELECTIVE PRINTING MECHANISMS, i.e. MECHANISMS PRINTING OTHERWISE THAN FROM A FORME; CORRECTION OF TYPOGRAPHICAL ERRORS
- B41J29/00—Details of, or accessories for, typewriters or selective printing mechanisms not otherwise provided for
- B41J29/38—Drives, motors, controls or automatic cut-off devices for the entire printing mechanism
- B41J29/393—Devices for controlling or analysing the entire machine ; Controlling or analysing mechanical parameters involving printing of test patterns
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04N—PICTORIAL COMMUNICATION, e.g. TELEVISION
- H04N1/00—Scanning, transmission or reproduction of documents or the like, e.g. facsimile transmission; Details thereof
- H04N1/46—Colour picture communication systems
- H04N1/50—Picture reproducers
Landscapes
- Engineering & Computer Science (AREA)
- Multimedia (AREA)
- Signal Processing (AREA)
- Quality & Reliability (AREA)
- Ink Jet (AREA)
- Particle Formation And Scattering Control In Inkjet Printers (AREA)
- Application Of Or Painting With Fluid Materials (AREA)
Abstract
Description
static void ObtainMisregistrationTransferFunction ( int dotsPerPixel, int subdotsPerDot, BI_Image const& dotImage, char const*pDotImageName, char const*pRefDotImageName, int const overlapSize, int const overlapIndex, ∥0..overlapSize-1 int const misregFactor, BI_Image const& ditherMatrix, BI_LUT&lutv, BI_LUT&lut0, BI_LUT&lut1 ); class RLE_DotLine { public: RLE_DotLine() :m_whiteRun(0),m_blackRun(0){} RLE_DotLine(int whiteRun,int blackRun) :m_whiteRun(whiteRun), m_blackRun(blackRun){} int WhiteRun()const{return m_whiteRun;} int BlackRun()const{return m_blackRun;} <!-- SIPO <DP n="11"> --> <dp n="d11"/> private: int m_whiteRun; int m_blackRun; }; typedef vector<RLE_DotLine,allocator<RLE_DotLine>>RLE_Dot; static void Usage() { fprintf(stderr,″usage:SegmentDither\n″); fprintf(stderr,″ inputImage\n″); fprintf(stderr,″ dotsPerPixel\n″); fprintf(stderr,″ subdotsPerDot\n″); fprintf(stderr,″ dotImage\n″); fprintf(stderr,″ refDotImage\n″); fprintf(stderr,″ overlapCenter\n″); fprintf(stderr,″ overlapSize\n″); fprintf(stderr,″ misregFactor\n″); fprintf(stderr,″ ditherMatrix\n″); fprintf(stderr,″ outputImage\n″); fprintf(stderr,″ outputResolution\n″); exit(1); } static void BadArgument(char const*pErrorMsg) <!-- SIPO <DP n="12"> --> <dp n="d12"/> { fprintf(stderr,″SegmentDither:argument error:%s\n″,pErrorMsg); exit(1); } #define CHECK_ARGUMENT(cond)if(cond)BadArgument(#cond) static double MisregDots(int const misregFactor) { return(double)misregFactor/1000; } static int MisregSubdots(int const misregFactor,int const subdotsPerDot) { return(int)BU_Round(MisregDots(misregFactor)*subdotsPerDot); } static void PutDot ( int const subdotsPerDot, RLE_Dot const&rleDot, int const dotRow, int const dotCol, <!-- SIPO <DP n="13"> --> <dp n="d13"/> int const misregFactor, BI_Image&outputImage ) { int const misregSubdots=MisregSubdots(misregFactor, subdotsPerDot); int const subdotRow=dotRow*subdotsPerDot; int const subdotCol=dotCol*subdotsPerDot; int const dotOverlap=rleDot.size()-subdotsPerDot; int const dotMargin=dotOverlap/2; RLE_Dot∷const_iterator ii=rleDot.begin(); for(int i=0;i<rleDot.size();i++,ii++) { int const row=subdotRow-dotMargin+i; if(row<0‖row>=outputImage.Height()) continue; int const whiteRun=(*ii).WhiteRun(); int blackRun=(*ii).BlackRun(); int col=subdotCol-dotMargin+whiteRun+misregSubdots; if(col<0) { blackRun+=col; col=0; } if(col+blackRun>=outputImage.Width()) <!-- SIPO <DP n="14"> --> <dp n="d14"/> blackRun=outputImage.Width()-col; if(blackRun<=0) continue; BU_ExpandBitRun ( outputImage.Image(row), col, outputImage.Width(), blackRun, 1 ); } } static void MergeScale ( double const scale, int&v, double&f0, double&f1 ) { double const vScaled=(double)v*scale; if(vScaled<=255.0) { v=(int)BU_Round(vScaled); <!-- SIPO <DP n="15"> --> <dp n="d15"/> } else { v=255; double const fScale=vScaled/255.0; f0*=fScale; f1*=fScale; } } static void Dither ( BI_Image const&inputImage, BI_LUT const&lutDotGain, int const dotsPerPixel, int const subdotsPerDot, BI_Image const&dotImage, char const*pDotImageName, char const*pRefDotImageName, int const overlapCenter, int const overlapSize, int const misregFactor, BI_Image const&ditherMatrix, BI_Image&outputImage, int const outputResolution, bool const bRetain, bool const bSkipLHS, <!-- SIPO <DP n="16"> --> <dp n="d16"/> bool const bSkipRHS, bool const bFixedInterp=false, double const fixedF0=0, double const fixedF1=0 ) { ∥compute overlap interval int const overlapStart=overlapCenter-(overlapSize/2); int const overlapEnd=overlapStart+overlapSize-1; ∥copy and invert dither matrix BI_Image ditherMatrix2; ditherMatrix2=ditherMatrix; BI_Invert(ditherMatrix2); ∥initialise and clear output image int const subdotsPerPixel=dotsPerPixel*subdotsPerDot; int const bilevelHeight=inputImage.Height()*subdotsPerPixel; int const bilevelWidth=inputImage.Width()*subdotsPerPixel; if(!bRetain) { ∥initialise outputImage.Initialise ( BI_ColorModel(BI_ColorGrayscale,1), bilevelHeight, bilevelWidth, outputResolution, outputResolution <!-- SIPO <DP n="17"> --> <dp n="d17"/> ); ∥clear BI_CC*pOutputRow=outputImage.Image(); for(intj=0;j<outputImage.Height();j++) { BU_ClearLine(pOutputRow,outputImage.Width()); pOutputRow+=outputImage.RowSize(); } } ∥convert dot image to RLE RLE_DotrleDot; for(int i=0;i<dotImage.Height();i++) { int const whiteRun=BU_GetBitRun ( dotImage.Image(i), 0, dotImage.Width(), 0∥white ); int blackRun; if(whiteRun=dotImage.Width()) { blackRun=0; } else { <!-- SIPO <DP n="18"> --> <dp n="d18"/> blackRun=BU_GetBitRun ( dotImage.Image(i), whiteRun, dotImage.Width(), 1∥black ); } rleDot.push_back(RLE_DotLine(whiteRun,blackRun)); } ∥dither contone input image to bi-level output image BI_CC const*pImage=inputImage.Image(); BI_CC const*pRow=pImage; BI_CC const*pDither=ditherMatrix.Image(); BI_CC const*pDitherRow=pDither; BI_CC const*pDither2=ditherMatrix2.Image(); BI_CC const*pDitherRow2=pDither2; int ditherRow=0; for(int row=0;row<inputImage.Height();row++) { for(int dotRow=0;dotRow<dotsPerPixel;dotRow++) { int const globalDotRow=(row*dotsPerPixel)+ dotRow; BI_CC const*pPixel=pRow; BI_CC const*pDitherPixel=pDitherRow; BI_CC const*pDitherPixel2=pDitherRow2; int ditherCol=0; <!-- SIPO <DP n="19"> --> <dp n="d19"/> for(int col=0;col<inputImage.Width();col++) { int const vRaw=*pPixel++; int const vDotGain=lutDotGain[vRaw]; for(int dotCol=0;dotCol<dotsPerPixel; dotCol++) { int vRawDot=vRaw; int const t0=*pDitherPixel; int const tl=t0;∥*pDitherPixel2; int const globalDotCol=(col* dotsPerPixel)+dotCol; ∥interpolate intensities in overlap region and dither ∥one or the other or both if(!bFixedInterp && globalDotCol< overlapStart) { int const t=t0; if((vDotGain=255)‖(vDotGain >=t&&vDotGain!=0)) { if(!bSkipLHS) { PutDot ( subdotsPerDot, <!-- SIPO <DP n="20"> --> <dp n="d20"/> rleDot, globalDotRow, globalDotCol, 0, outputImage ); } } } else if(!bFixedInterp&&overlapEnd< globalDotCol) { int const t=(overlapSize=0)?t0: t1; if((vDotGain=255)‖(vDotGain >=t&&vDotGain!=0)) { if(!bSkipRHS) { PutDot ( subdotsPerDot, rleDot, globalDotRow, globalDotCol, misregFactor, outputImage ); <!-- SIPO <DP n="21"> --> <dp n="d21"/> } } } else { #if1 ∥account for stretch or shrink if(!bFixedInterp) { double const misregDots= MisregDots(misregFactor); double const newOverlapSize =overlapSize+misregDots; double const overlapScale= newOverlapSize/overlapSize; vRawDot= (int)BU_Round(vRawDot*overlapScale); if(vRawDot>255) vRawDot=255; ∥MergeScale(overlapScale, vRawDot,f0,f1); } #endif #if1 ∥compute interpolation factors double f0,f1; if(bFixedInterp) <!-- SIPO <DP n="22"> --> <dp n="d22"/> { f0=fixedF0; f1=fixedF1; } else { ∥compute overlap index int const overlapIndex= globalDotCol- overlapStart; ∥obtain misregistration LUTs BI_LUT lutv; BI_LUT lut0; BI_LUT lut1; ObtainMisregistrationTransferFunction ( dotsPerPixel, subdotsPerDot, dotImage, pDotImageName, pRefDotImageName, overlapSize, overlapIndex, misregFactor, ditherMatrix, lutv, <!-- SIPO <DP n="23"> --> <dp n="d23"/> lut0, lut1 ); ∥retrieve interpolation factors f0=(double)lut0[vRawDot]/ 255; f1=(double)lut1[vRawDot]/ 255; if(globalDotCol> overlapCenter) BU_Swap(f0,f1); ∥adjust intensityf for attenuation vRawDot=lutv[vRawDot]; } #endif ∥diagnostics ∥printf(″f0=%5.1lf1=%5.1lf (%5.11f)vRaw=%dv=%d\n″, ∥ f0,f1,f0+f1,vRaw, vRawDot); ∥interpolate dither with jitter int vd=0; int v0d=0; <!-- SIPO <DP n="24"> --> <dp n="d24"/> int vld=0; if((vRawDot=255)‖(vRawDot >=t0&&vRawDot!=0)) { vd=1; } double const rr=(double)rand()/ RAND_MAX; if(vd&&rr<f0) { v0d=1; if(!bSkipLHS) { PutDot ( subdotsPerDot, rleDot, globalDotRow, globalDotCol, 0, outputImage ); } } if(vd&&(1.0-rr)<=f1) { v1d=1; <!-- SIPO <DP n="25"> --> <dp n="d25"/> if(!bSkipRHS) { PutDot ( subdotsPerDot, rleDot, globalDotRow, globalDotCol, misregFactor, outputImage ); } } #if0 if(globalDotRow=864) { printf(″%1d%1d%1d(%3d %3d%3d%3d)″, vd,v0d,v1d,vRawDot, v0,v1,v0+v1); if(v0d+v1d<vd) printf(″?″); if(v0d+v1d>vd) printf(″#″); printf\n″); } #endif } <!-- SIPO <DP n="26"> --> <dp n="d26"/> pDitherPixel++; pDitherPixel2++; ditherCol++; if(ditherCol>=ditherMatrix.Width()) { pDitherPixel=pDitherRow; pDitherPixel2=pDitherRow2; ditherCol=0; } } } pDitherRow+=ditherMatrix.RowSize(); pDitherRow2+=ditherMatrix2.RowSize(); ditherRow++; if(ditherRow>=ditherMatrix.Height()) { pDitherRow=pDither; pDitherRow2=pDither2; ditherRow=0; } } pRow+=inputImage.RowSize(); } } static void ChangeFileSuffx ( <!-- SIPO <DP n="27"> --> <dp n="d27"/> char const*pPath, char const*pSuffix, char const*pExt, char path[_MAX_PATH] ) { char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; char fname[_MAX_FNAME]; char ext[_MAX_EXT]; _splitpath(pPath,drive,dir,fname,ext); strcat(fname,pSuffix); _makepath(path,drive,dir,fname,pExt); } static void LogTransferFunction(char const*pType,double const intensity[],int const v) { printf(″%s:%03d:%5.1lf(%5.11f)\n″, pType,v,intensity[v],v-intensity[v]); } static void ComputeMisregistrationTransferFunction ( int dotsPerPixel, <!-- SIPO <DP n="28"> --> <dp n="d28"/> int subdotsPerDot, BI_Image const&dotImage, char const*pDotImageName, double const f0, double const f1, int const misregFactor, BI_Image const&ditherMatrix, BI_LUT&lutv, BI_LUT&lut0, BI_LUT&lut1 ) { ∥create test image BI_Image testImage; testImage.Initialise ( BI_ColorModel(BI_ColorGrayscale), ditherMatrix.Height(), ditherMatrix.Width() ); ∥build identity transfer function BI_LUT identityLut; for(int v=0;v<256;v++) identityLut[v]=v; ∥create output image BI_Image outputImage; <!-- SIPO <DP n="29"> --> <dp n="d29"/> ∥compute intensity for each gray level double intensigy[512]; int vLast; for(v=0;v<512;v++) { ∥compute extended interpolation factors double f0x,f1x; int vx; if(v<=255) { vx=v; f0x=f0; f1x=f1; } else { vx=255; double const fScale=(double)v/255.0; f0x=f0*fScale; f1x=f1*fScale; } ∥set test image to next intensity testImage=BI_Color((BI_CC)vx); ∥dither test image to bi-level output Dither ( testImage, <!-- SIPO <DP n="30"> --> <dp n="d30"/> identityLut, dotsPerPixel, subdotsPerDot, dotImage, pDotImageName, pDotImageName, 0,0, ∥no explicit overlap misregFactor, ditherMatrix, outputImage, 72, ∥output resolution false, ∥don′t retain output image false, ∥don′t skip LHS false, ∥don′t skip RHS true, ∥fixed interpolation f0x, f1x ); ∥determine intensityof dithered bi-level output long nDots=0; BI_CC const*pRow=outputImage.Image(); for(int row=0;row<outputImage.Height();row++) { nDots+=BU_CountBits(pRow,0, outputImage.Width()); pRow+=outputImage.RowSize(); } intensity[v]=255*(double)nDots/ <!-- SIPO <DP n="31"> --> <dp n="d31"/> outputImage.PixelCount(); ∥LogTransferFunction(″misreg″,intensity,v); vLast=v; if(intensity[v]>=255) break; } LogTransferFunction(″misreg″,intensity,1); LogTransferFunction(″misreg″,intensity,vLast); ∥create LUTs for(int x=0;x<256;x++) { double d=-1; for(v=0;v<=vLast;v++) { double const d2=BU_Abs(intensity[v]-x); if(d<0‖d2<d) { d=d2; if(v<=255) { lutv[x]=v; int const k0=(int)BU_Round(f0*255); lut0[x]=(BI_CC)BU_Min(k0,255); int const k1=(int)BU_Round(f1*255); lut1[x]=(BI_CC)BU_Min(k1,255); } else <!-- SIPO <DP n="32"> --> <dp n="d32"/> { lutv[x]=255; int const k0=(int)BU_Round(f0*v); lut0[x]=(BI_CC)BU_Min(k0,255); int const k1=(int)BU_Round(f1*v); lut1[x]=(BI_CC)Bu_Min(k1,255); if(k0>255‖k1>255) { fprintf(stderr,″k0=%d k1=%d (x=%d v=%d fO=%5.11f fl=%5.1lf\n″, k0,k1,x,v,f0,f1); } } } } } } static void SimplifyFraction(int&n,int&d) { for(int i=n;i>1&&n>1;-i) { if((d%i)=0) { if((n%i)=0) { n/=i; <!-- SIPO <DP n="33"> --> <dp n="d33"/> d/=i; } } } } static void ObtainMisregistrationTransferFunction ( int dotsPerPixel, int subdotsPerDot, BI_Image const&dotImage, char const*pDotImageName, char const*pRefDotImageName, int const overlapSize, int const rawOverlapIndex, ∥0..overlapSize-1 int const misregFactor, BI_Image const&ditherMatrix, BI_LUT&lutv, BI_LUT&lut0, BI_LUT&lut1 ) { ∥nonmalize overlap index int overlapIndex=rawOverlapIndex; if(overlapIndex>=((overlapSize+1)/2)) overlapIndex=(overlapSize-1)-overlapIndex; <!-- SIPO <DP n="34"> --> <dp n="d34"/> char lutvName[_MAX_PATH]; char lut0Name[_MAX_PATH]; char lut1Name[_MAX_PATH]; char suffix[_MAX_FNAME]; int interpNum=overlapIndex+1; int interpDenom=overlapSize+1; SimplifyFraction(interpNum,interpDenom); sprintf(suffix,″_%03d_%02d_%02d″, BU_Abs(misregFactor),interpNum,interpDenom); ChangeFileSuffix(pRefDotImageName,suffix,″.amp″,lutvName); sprintf(suffix,″_%03d_%02d_%02d_0″, BU_Abs(misregFactor),interpNum,interpDenom); ChangeFileSuffix(pRefDotImageName,suffix,″.amp″,lut0Name); sprintf(suffix,″_%03d_%02d_%02d_1″, BU_Abs(misregFactor),interpNum,interpDenom); ChangeFileSuffix(pRefDotImageName,suffix,″.amp″,lut1Name); try { BU_File lutvFile(lutvName,_O_BINARY|_O_RDONLY); lutv.Load(lutvFile); BU_File lut0File(lut0Name,_O_BINARY|_O_RDONLY); lut0.Load(lut0File); BU_File lut1File(lutlName,_O_BINARY|_O_RDONLY); lut1.Load(lutlFile); <!-- SIPO <DP n="35"> --> <dp n="d35"/> } catch(...) { ∥if using a reference dot image,LUTs must already exist if(strcmp(pDotmageName,pRefDotImgeName)!=0) { fprintf(stderr,″can′tload%s or%s or%s\n″, lutvName,lut0Name,lut1Name); exit(1); } ∥determine interpolation factors double f1=(double)interpNum/interpDenom; double f0=1.0-fl; ComputeMisregistrationTransferFunction ( dotsPerPixel, subdotsPerDot, dotImage, pDotImageName, f0, f1, BU_Abs(misregFactor), ditherMatrix, lutv, lut0, lut1 ); <!-- SIPO <DP n="36"> --> <dp n="d36"/> BU_File lutvFile(lutvName,_O_BINARY|_O_WRONLY| _O_CREAT); lutv.Save(lutvFile); BU_File lut0File(lut0Name,_O_BINARY|_O_WRONLY| _O_CREAT); lut0.Save(lut0File); BU_File lut1 File(lutlName,_O_BINARY|_O_WRONLY| _O_CREAT); lut1.Save(lut1File); } } static void ComputeDotGainTransferFunction ( int dotsPerPixel, int subdotsPerDot, BI_Image const&dotImage, char const*pDotImageName, BI_Image const&ditherMatrix, BI_LUT&lutDotGain ) { ∥create test image BI_Image testImage; testImage.Initialise ( BI_ColorModel(BI_ColorGrayscale), <!-- SIPO <DP n="37"> --> <dp n="d37"/> ditherMatrix.Height(), ditherMatrix.Width() ); ∥build identity transfer funnction BI_LUT identityTransferFunction; for(int v=0;v<256;v++) identityTransferFunction[v]=v; ∥create output image BI_Image outputImage; ∥compute intensity for each gray level double intensigy[256]; for(v=0;v<256;v++) { ∥set test image to next intensity testImage=BI_Color((BI_CC)v); ∥dither test image to bi-level output Dither ( testImage, identityTransferFunction, dotsPerPixel, subdotsPerDot, dotImage, pDotImageName, pDotImageName, <!-- SIPO <DP n="38"> --> <dp n="d38"/> 0,0, ∥no overlap 0, ∥no misregistration ditherMatrix, outputImage, 72, ∥output resolution false, ∥don′t retain output image false, ∥don′t skip LHS false ∥don′t skip RHS ); ∥determine intensity of dithered bi-level output longnDots=0; BI_CC const*pRow=outputImage.Image(); for(int row=0;row<outputImage.Height();row++) { nDots+=BU_CountBits(pRow,0, outputImage.Width()); pRow+=outputImage.RowSize(); } intensity[v]=255*(double)nDots/ outputImage.PixelCount(); ∥LogTransferFunction(″dot gain″,intensity,v); } LogTransferFunction(″dot gain″,intensity,1); LogTransferFunction(″dot gain″,intensity,255); <!-- SIPO <DP n="39"> --> <dp n="d39"/> ∥create LUT for(int x=0;x<256;x++) { double d=-1; for(v=0;v<256;v++) { double const d2=BU_Abs(intensity[v]-x); if(d<0‖d2<d) { d=d2; lutDotGain[x]=v; } } } } static void ObtainDotGainTransferFunction ( int dotsPerPixel, int subdotsPerDot, BI_Image const&dotImage, char const*pDotImageName, char const*pRefDotImageName, BI_Image const&ditherMatrix, BI_LUT&lutDotGain ) { <!-- SIPO <DP n="40"> --> <dp n="d40"/> char lutName[_MAX_PATH]; ChangeFileSuffix(pRefDotImageName,″″,″.amp″,lutName); try { BU_File lutFile(lutName,_O_BINARY|_O_RDONLY); lutDotGain.Load(lutFile); } catch(...) { ∥if using a reference dot image,LUT must already exist if(strcmp(pDotImageName,pRefDotImageName)!=0) { fprint(stderr,″can′t load%s\n″,lutName); exit(1); } ComputeDotGainTransferFunction ( dotsPerPixel, subdotsPerDot, dotImage, pDotImageName, ditherMatrix, lutDotGain ); BU_File lutFile(lutName,_O_BINARY|_O_WRONLY| _O_CREAT); lutDotGain.Save(lutFile); } } <!-- SIPO <DP n="41"> --> <dp n="d41"/> static void SegmentDither(int argc,char*argv[]) { ∥parse arguments if(argc!=12) Usage(); char const*pInputImageName=argv[1]; int const dotsPerPixel=atoi(argv[2]); int const subdotsPerDot=atoi(argv[3]); char const*pDotImageName=argv[4]; char const*pRefDotImageName=argv[5]; int const overlapCenter=atoi(argv[6]); int const overlapSize=atoi(argv[7]); int const misregFactor=atoi(argv[8]); int const misregSubdots=MisregSubdots(misregFactor, subdotsPerDot); char const*pDitherMatrixName=argv[9]; char const*pOutputImageName=argv[10]; int const outputResolution=atoi(argv[11]); ∥open input image BI_Image inputImage; BI_LoadImage(inputImage,pInputImageName); CHECK_ARGUMENT(inputImage.ColorModel()!= BI_ColorModel(BI_ColorGrayscale)); BI_Invert(inputImage);∥max is black BI_TIFFSetMinIsBlack(false);∥max is black <!-- SIPO <DP n="42"> --> <dp n="d42"/> ∥check arguments CHECK_ARGUMENT(dotsPerPixel<1); CHECK_ARGUMENT(dotsPerPixel>16); CHECK_ARGUMENT(subdotsPerDot<1); CHECK_ARGUMENT(subdotsPerDot>32); CHECK_ARGUMENT(overlapCenter<1); CHECK_ARGUMENT(overlapCenter>=inputImage.Width()* dotsPerPixel); CHECK_ARGUMENT(overlapSize<0); CHECK_ARGUMENT(misregSubdots<-subdotsPerDot/2); CHECK_ARGUMENT(misregSubdots>subdotsPerDot/2); CHECK_RGUMENT(outputResolution<=0); ∥diagnostics printf(″misregSubdots=%d\n″,misregSubdots); ∥open dot image BI_Image dotImage; BI_LoadImage(dotImage,pDotImageName); CHECK_ARGUMENT(dotImage.ColorModel()!= BI_ColorModel(BI_ColorGrayscale,1)); CHECK_ARGUMENT(dotImage.Height()<subdotsPerDot); CHECK_ARGUMENT(dotImage.Width()<subdotsPerDot); CHECK_ARGUMENT(dotImage.Height()!=dotImage.Width()); int const dotOverlap=dotImage.Width()-subdotsPerDot; CHECK_ARUMENT((dotOverlap%2)!=0); ∥open dither matrix <!-- SIPO <DP n="43"> --> <dp n="d43"/> BI_Image ditherMatrix; BI_LoadImage(ditherMatrix,pDitherMatrixName); CHEC_ARGUMENT(ditherMatrix.ColorModel()!= BI_ColorModel(BI_ColorGrayscale,8)); CHECK_ARGUMENT(ditherMatrix.Height()<16); CHECK_ARGUMENT(ditherMatrix.Width()<16); ∥create output image BI_Image outputImage; ∥obtain dot gain transfer function for particular dot shape BI_IUT lutDotGain; ObtainDotGainTransferFunction ( dotsPerPixel, subdotsPerDot, dotImage, pDotImageName, pRefDotImageName, ditherMatrix, lutDotGain ); ∥dither input to bi-level output Dither ( inputImage, lutDotGain, dotsPerPixel, <!-- SIPO <DP n="44"> --> <dp n="d44"/> subdotsPerDot, dotImage, pDotImageName, pRefDotImageName, overlapCenter, overlapSize, misregFactor, ditherMatrix, outputImage, outputResolution, false, ∥don′t retain output image false, ∥don′t skip LHS false ∥don′t skip RHS ); BI_SaveImge(outputImage,pOutputImageName); ∥dither input to bi-level output(LHS only) BI_Image outputImageLHS; Dither ( inputImage, lutDotGain, dotsPerPixel, subdotsPerDot, dotImage, pDotImageName, pRefDotImageName, overlapCenter, overlapSize, <!-- SIPO <DP n="45"> --> <dp n="d45"/> misregFactor, ditherMatrix, outputImageLHS, outputResolution, false, ∥don′t retain output image false, ∥don′t skip LHS true ∥skip RHS ); BI_SaveImage(outputImageLHS,"OutLHS.GIF"); ∥dither input to bi-level output(RHS only) BI_Image outputImageRHS; Dither ( inputImage, lutDotGain, dotsPerPixel, subdotsPerDot, dotImage, pDotImageName, pRefDotImageName, overlapCenter, overlapSize, misregFactor, ditherMatrix, outputImageRHS, outputResolution, false, ∥don′t retain output image true, ∥skip LHS <!-- SIPO <DP n="46"> --> <dp n="d46"/> false ∥don′t skip RHS ); BI_SaveImage(outputImageRHS,″OutRHS.GIF″); ∥dither input to bi-level output(no interp) BI_Image outputImageNoInterp; Dither ( inputImage, lutDotGain, dotsPerPixel, subdotsPerDot, dotImage, pDotImageName, pRefDotImageName, overlapCenter, overlapSize, misregFactor, ditherMatrix, outputImageNoInterp, outputResolution, false, ∥don′t retain output image false, ∥skip LHS false, ∥don′t skip RHS true, ∥fixed interp 0, ∥f0 0 ∥f1 ); BI_SaveImage(outputImageNoInterp,"OutNoInterp.GIF"); <!-- SIPO <DP n="47"> --> <dp n="d47"/> } void main(int argc,char*argv[]) { try { SegmentDither(argc,argv); } catch(BU_Error error) { error.Print(); } exit(0); }
Claims (19)
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
PCT/AU2000/000593 WO2001089845A1 (en) | 2000-05-24 | 2000-05-24 | Method and apparatus for compensation for time varying nozzle misalignment in a drop on demand printhead |
Related Child Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB2005100631902A Division CN1321819C (zh) | 2000-05-24 | 2000-05-24 | 具有用于重叠打印头元件的补偿的喷墨打印机 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1452557A true CN1452557A (zh) | 2003-10-29 |
CN1205043C CN1205043C (zh) | 2005-06-08 |
Family
ID=3700812
Family Applications (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN00819578.1A Expired - Fee Related CN1205043C (zh) | 2000-05-24 | 2000-05-24 | 用于补偿喷墨打印头中喷嘴随时间变化发生错位的方法和装置 |
CNB2005100631902A Expired - Lifetime CN1321819C (zh) | 2000-05-24 | 2000-05-24 | 具有用于重叠打印头元件的补偿的喷墨打印机 |
Family Applications After (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB2005100631902A Expired - Lifetime CN1321819C (zh) | 2000-05-24 | 2000-05-24 | 具有用于重叠打印头元件的补偿的喷墨打印机 |
Country Status (10)
Country | Link |
---|---|
US (3) | US7201460B1 (zh) |
EP (1) | EP1301347B1 (zh) |
JP (1) | JP4460206B2 (zh) |
CN (2) | CN1205043C (zh) |
AT (1) | ATE367926T1 (zh) |
AU (2) | AU4732800A (zh) |
DE (1) | DE60035715T2 (zh) |
IL (3) | IL153025A (zh) |
WO (1) | WO2001089845A1 (zh) |
ZA (1) | ZA200209791B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103269854A (zh) * | 2010-12-23 | 2013-08-28 | 利乐拉瓦尔集团及财务有限公司 | 改进的苯胺印刷、装置以及方法 |
CN109254742A (zh) * | 2018-10-13 | 2019-01-22 | 森大(深圳)技术有限公司 | 喷墨打印方法、喷墨打印装置及喷墨打印设备 |
CN113858802A (zh) * | 2020-06-30 | 2021-12-31 | 森大(深圳)技术有限公司 | 消除喷头拼接道的方法、装置、设备及存储介质 |
Families Citing this family (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6464332B1 (en) * | 2000-05-23 | 2002-10-15 | Silverbrook Research Pty Ltd. | Method and apparatus for the compensation for time varying nozzle misalignment in a drop on demand printhead |
US7044585B2 (en) | 2000-05-23 | 2006-05-16 | Silverbrook Research Pty Ltd | Method of generating halftone print data for overlapping end portions of printhead chips |
JP4460206B2 (ja) * | 2000-05-24 | 2010-05-12 | シルバーブルック リサーチ ピーティワイ リミテッド | ドロップオンデマンドプリントヘッドにおいて時間とともに変動するノズルのミスアライメントを補正する方法および装置 |
JP4276811B2 (ja) * | 2002-02-26 | 2009-06-10 | オリンパス株式会社 | 画像記録装置 |
JP4717342B2 (ja) * | 2003-12-02 | 2011-07-06 | キヤノン株式会社 | インクジェット記録装置及び方法 |
JP4804043B2 (ja) * | 2005-06-03 | 2011-10-26 | キヤノン株式会社 | インクジェット記録装置、インクジェット記録方法、および記録制御形態の設定方法 |
JP5213317B2 (ja) * | 2006-08-22 | 2013-06-19 | キヤノン株式会社 | インクジェット記録装置およびインクジェット記録方法 |
GB0619523D0 (en) * | 2006-10-03 | 2006-11-15 | Xaar Technology Ltd | Method for printing |
JP5272528B2 (ja) * | 2008-06-09 | 2013-08-28 | セイコーエプソン株式会社 | 記録装置、及び記録方法 |
JP4983982B2 (ja) * | 2008-06-09 | 2012-07-25 | コニカミノルタホールディングス株式会社 | 画像記録方法および画像記録装置 |
JP6268846B2 (ja) * | 2013-09-19 | 2018-01-31 | セイコーエプソン株式会社 | ヘッドユニット、画像記録装置 |
JP2016107406A (ja) * | 2014-12-02 | 2016-06-20 | 株式会社リコー | 画像処理装置、画像処理システム、画像処理プログラムおよび立体物の生産方法 |
JP2017081110A (ja) * | 2015-10-30 | 2017-05-18 | キヤノン株式会社 | 画像処理装置および画像処理方法 |
CN111844917B (zh) * | 2020-08-07 | 2021-01-15 | 广东金海科技实业有限责任公司 | 一种水洗充皮纸的环保制作工艺 |
Family Cites Families (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0034060A1 (en) * | 1980-02-08 | 1981-08-19 | The Mead Corporation | Ink jet printer |
CN1048451C (zh) * | 1989-06-15 | 2000-01-19 | 株式会社亚玛托亚商会 | 喷墨式打印机 |
US4977410A (en) * | 1989-09-14 | 1990-12-11 | Seiko Instruments Inc. | Thermal line printer with staggered head segments and overlap compensation |
JP2891799B2 (ja) | 1991-06-07 | 1999-05-17 | キヤノン株式会社 | インクジェット記録方法 |
US5600354A (en) | 1992-04-02 | 1997-02-04 | Hewlett-Packard Company | Wrap-around flex with address and data bus |
US5450099A (en) | 1993-04-08 | 1995-09-12 | Eastman Kodak Company | Thermal line printer with staggered head segments and overlap compensation |
JP3174226B2 (ja) * | 1994-10-28 | 2001-06-11 | キヤノン株式会社 | 記録ヘッド補正方法及びその装置及びその装置によって補正された記録ヘッド及びその記録ヘッドを用いた記録装置 |
US5767874A (en) | 1996-03-14 | 1998-06-16 | Eastman Kodak Company | Printing uniformity using narrow printhead segments in digital printers |
US6312099B1 (en) | 1997-01-21 | 2001-11-06 | Eastman Kodak Company | Printing uniformity using printhead segments in pagewidth digital printers |
EP0914950A3 (en) * | 1997-11-06 | 1999-12-08 | Xerox Corporation | An ink jet printhead assembled from partial width array printheads |
JP3596725B2 (ja) * | 1998-05-20 | 2004-12-02 | 株式会社リコー | インクジェット記録装置及び記憶媒体 |
JPH11334051A (ja) | 1998-05-28 | 1999-12-07 | Toshiba Tec Corp | インクジェット記録装置 |
US6213579B1 (en) | 1998-11-24 | 2001-04-10 | Lexmark International, Inc. | Method of compensation for the effects of thermally-induced droplet size variations in ink drop printers |
US6464332B1 (en) | 2000-05-23 | 2002-10-15 | Silverbrook Research Pty Ltd. | Method and apparatus for the compensation for time varying nozzle misalignment in a drop on demand printhead |
JP4460206B2 (ja) * | 2000-05-24 | 2010-05-12 | シルバーブルック リサーチ ピーティワイ リミテッド | ドロップオンデマンドプリントヘッドにおいて時間とともに変動するノズルのミスアライメントを補正する方法および装置 |
-
2000
- 2000-05-24 JP JP2001586062A patent/JP4460206B2/ja not_active Expired - Fee Related
- 2000-05-24 AU AU4732800A patent/AU4732800A/xx active Pending
- 2000-05-24 WO PCT/AU2000/000593 patent/WO2001089845A1/en active IP Right Grant
- 2000-05-24 IL IL15302500A patent/IL153025A/xx not_active IP Right Cessation
- 2000-05-24 AU AU2000247328A patent/AU2000247328B2/en not_active Ceased
- 2000-05-24 CN CN00819578.1A patent/CN1205043C/zh not_active Expired - Fee Related
- 2000-05-24 DE DE60035715T patent/DE60035715T2/de not_active Expired - Lifetime
- 2000-05-24 US US10/296,436 patent/US7201460B1/en not_active Expired - Fee Related
- 2000-05-24 EP EP00929105A patent/EP1301347B1/en not_active Expired - Lifetime
- 2000-05-24 CN CNB2005100631902A patent/CN1321819C/zh not_active Expired - Lifetime
- 2000-05-24 AT AT00929105T patent/ATE367926T1/de not_active IP Right Cessation
-
2002
- 2002-12-03 ZA ZA200209791A patent/ZA200209791B/xx unknown
-
2005
- 2005-02-14 IL IL166876A patent/IL166876A/en not_active IP Right Cessation
- 2005-02-28 IL IL167154A patent/IL167154A/en not_active IP Right Cessation
-
2007
- 2007-02-16 US US11/706,950 patent/US7517037B2/en not_active Expired - Fee Related
-
2009
- 2009-04-13 US US12/422,939 patent/US7837289B2/en not_active Expired - Fee Related
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103269854A (zh) * | 2010-12-23 | 2013-08-28 | 利乐拉瓦尔集团及财务有限公司 | 改进的苯胺印刷、装置以及方法 |
CN103269854B (zh) * | 2010-12-23 | 2015-04-22 | 利乐拉瓦尔集团及财务有限公司 | 改进的苯胺印刷、装置以及方法 |
CN109254742A (zh) * | 2018-10-13 | 2019-01-22 | 森大(深圳)技术有限公司 | 喷墨打印方法、喷墨打印装置及喷墨打印设备 |
CN113858802A (zh) * | 2020-06-30 | 2021-12-31 | 森大(深圳)技术有限公司 | 消除喷头拼接道的方法、装置、设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
WO2001089845A8 (en) | 2003-12-24 |
ATE367926T1 (de) | 2007-08-15 |
US20070153038A1 (en) | 2007-07-05 |
AU4732800A (en) | 2001-12-03 |
EP1301347A4 (en) | 2005-11-30 |
US7837289B2 (en) | 2010-11-23 |
CN1205043C (zh) | 2005-06-08 |
US7201460B1 (en) | 2007-04-10 |
WO2001089845A1 (en) | 2001-11-29 |
DE60035715T2 (de) | 2008-04-30 |
JP4460206B2 (ja) | 2010-05-12 |
EP1301347A1 (en) | 2003-04-16 |
IL166876A (en) | 2007-07-24 |
CN1672940A (zh) | 2005-09-28 |
AU2000247328B2 (en) | 2004-08-12 |
IL153025A0 (en) | 2003-06-24 |
ZA200209791B (en) | 2003-07-30 |
CN1321819C (zh) | 2007-06-20 |
EP1301347B1 (en) | 2007-07-25 |
DE60035715D1 (de) | 2007-09-06 |
US7517037B2 (en) | 2009-04-14 |
IL153025A (en) | 2005-06-19 |
JP2003534171A (ja) | 2003-11-18 |
IL167154A (en) | 2007-10-31 |
US20090195586A1 (en) | 2009-08-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1205043C (zh) | 用于补偿喷墨打印头中喷嘴随时间变化发生错位的方法和装置 | |
US7938498B2 (en) | Inkjet printhead with overlapping segments | |
US6547355B1 (en) | DOT formation position misalignment adjustment performed using pixel-level information indicating dot non-formation | |
US7744183B2 (en) | Method of generating halftone print data for overlapping consecutive printhead segments | |
AU2000247328A1 (en) | Method and apparatus for compensation for time varying nozzle misalignment in a drop on demand printhead | |
US6003972A (en) | Printer apparatus and printer head | |
JP6416432B1 (ja) | インクジェット印刷装置におけるインク濃度誤差補正方法 | |
JP2002331692A (ja) | 複数画素を階調再現の1単位とする印刷 | |
JP7483539B2 (ja) | 画像記録装置及び画像記録方法 | |
US11648782B2 (en) | Image processing apparatus, image processing method, and storage medium | |
KR100790616B1 (ko) | 드롭―온―디맨드형 프린트헤드에서의 시변 노즐미스얼라인먼트의 보상 방법 및 장치 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
ASS | Succession or assignment of patent right |
Owner name: ZAMTEC LTD. Free format text: FORMER OWNER: SILVERBROOK RESEARCH PTY. LTD. Effective date: 20140326 |
|
C41 | Transfer of patent application or patent right or utility model | ||
TR01 | Transfer of patent right |
Effective date of registration: 20140326 Address after: Dublin, Ireland Patentee after: Silverbrook Research Pty Ltd. Address before: 393 Darin street, Balmain, New South Wales, Australia Patentee before: Silverbrook Research Pty. Ltd. |
|
C56 | Change in the name or address of the patentee |
Owner name: MAGTE TECHNOLOGY CO., LTD. Free format text: FORMER NAME: ZAMTEC LTD. |
|
CP01 | Change in the name or title of a patent holder |
Address after: Dublin, Ireland Patentee after: MEMJET TECHNOLOGY LTD. Address before: Dublin, Ireland Patentee before: Silverbrook Research Pty Ltd. |
|
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20050608 Termination date: 20180524 |
|
CF01 | Termination of patent right due to non-payment of annual fee |