int lut(string option, string img){ Mat src = imread(img); if (src.empty()) { cout << "cannot open the pic" << endl; return -1; } resizeToscreen(src, Size(1920 / 4, 1080 / 4)); int w_pic, h_pic; w_pic = src.cols; h_pic = src.rows; double t = (double)getTickCount(); Mat fin_res; Image imgi(src); if (option == "-e") { fin_res = Mat(src.rows * 2, src.cols * 2, src.type()); drawtheblock(apply(imgi, 0), fin_res, Point(w_pic, 0), "log"); drawtheblock(apply(imgi, 1), fin_res, Point(0, h_pic), "sqrt"); drawtheblock(apply(imgi, 2), fin_res, Point(w_pic, h_pic), "pow_0.3"); } else fin_res = Mat(src.rows, src.cols * 2, src.type()); drawtheblock(src, fin_res, Point(0, 0), "original"); if (option == "-e") NULL; else if (option=="-log") drawtheblock(apply(imgi, 0), fin_res, Point(w_pic, 0), "log"); else if (option == "-sqrt") drawtheblock(apply(imgi, 1), fin_res, Point(w_pic, 0), "sqrt"); else if (option == "-pow") drawtheblock(apply(imgi, 2), fin_res, Point(w_pic, 0), "pow_0.3"); else if (option == "-h") help(); else{ cout << "invalid input , try again" << endl; help(); } t = ((double)getTickCount() - t) / getTickFrequency(); cout << "total time:" << t * 1000 << "ms" << endl; imshow("dst", fin_res); Mat gray; cvtColor(apply(imgi, 1), gray, CV_RGB2GRAY); Mat g2c = gray2Color(gray,true,8); imshow("graytoColor", g2c); waitKey(0); return 0; }
glyph *TeXFont_PFB::getGlyph(Q_UINT16 ch, bool generateCharacterPixmap, const QColor& color) { #ifdef DEBUG_PFB kdDebug(4300) << "TeXFont_PFB::getGlyph( ch=" << ch << ", '" << (char)(ch) << "', generateCharacterPixmap=" << generateCharacterPixmap << " )" << endl; #endif // Paranoia checks if (ch >= TeXFontDefinition::max_num_of_chars_in_font) { kdError(4300) << "TeXFont_PFB::getGlyph(): Argument is too big." << endl; return glyphtable; } // This is the address of the glyph that will be returned. struct glyph *g = glyphtable+ch; if (fatalErrorInFontLoading == true) return g; if ((generateCharacterPixmap == true) && ((g->shrunkenCharacter.isNull()) || (color != g->color)) ) { int error; unsigned int res = (unsigned int)(parent->displayResolution_in_dpi/parent->enlargement +0.5); g->color = color; // Character height in 1/64th of points (reminder: 1 pt = 1/72 inch) // Only approximate, may vary from file to file!!!! @@@@@ long int characterSize_in_printers_points_by_64 = (long int)((64.0*72.0*parent->scaled_size_in_DVI_units*parent->font_pool->getCMperDVIunit())/2.54 + 0.5 ); error = FT_Set_Char_Size(face, 0, characterSize_in_printers_points_by_64, res, res ); if (error) { QString msg = i18n("FreeType reported an error when setting the character size for font file %1.").arg(parent->filename); if (errorMessage.isEmpty()) errorMessage = msg; kdError(4300) << msg << endl; g->shrunkenCharacter.resize(1,1); g->shrunkenCharacter.fill(QColor(255, 255, 255)); return g; } // load glyph image into the slot and erase the previous one if (parent->font_pool->getUseFontHints() == true) error = FT_Load_Glyph(face, charMap[ch], FT_LOAD_DEFAULT ); else error = FT_Load_Glyph(face, charMap[ch], FT_LOAD_NO_HINTING ); if (error) { QString msg = i18n("FreeType is unable to load glyph #%1 from font file %2.").arg(ch).arg(parent->filename); if (errorMessage.isEmpty()) errorMessage = msg; kdError(4300) << msg << endl; g->shrunkenCharacter.resize(1,1); g->shrunkenCharacter.fill(QColor(255, 255, 255)); return g; } // convert to an anti-aliased bitmap error = FT_Render_Glyph( face->glyph, ft_render_mode_normal ); if (error) { QString msg = i18n("FreeType is unable to render glyph #%1 from font file %2.").arg(ch).arg(parent->filename); if (errorMessage.isEmpty()) errorMessage = msg; kdError(4300) << msg << endl; g->shrunkenCharacter.resize(1,1); g->shrunkenCharacter.fill(QColor(255, 255, 255)); return g; } FT_GlyphSlot slot = face->glyph; if ((slot->bitmap.width == 0) || (slot->bitmap.rows == 0)) { if (errorMessage.isEmpty()) errorMessage = i18n("Glyph #%1 is empty.").arg(ch); kdError(4300) << i18n("Glyph #%1 from font file %2 is empty.").arg(ch).arg(parent->filename) << endl; g->shrunkenCharacter.resize( 15, 15 ); g->shrunkenCharacter.fill(QColor(255, 0, 0)); g->x2 = 0; g->y2 = 15; } else { QImage imgi(slot->bitmap.width, slot->bitmap.rows, 32); imgi.setAlphaBuffer(true); // Do QPixmaps fully support the alpha channel? If yes, we use // that. Otherwise, use other routines as a fallback if (parent->font_pool->QPixmapSupportsAlpha) { // If the alpha channel is properly supported, we set the // character glyph to a colored rectangle, and define the // character outline only using the alpha channel. That // ensures good quality rendering for overlapping characters. uchar *srcScanLine = slot->bitmap.buffer; for(int row=0; row<slot->bitmap.rows; row++) { uchar *destScanLine = imgi.scanLine(row); for(int col=0; col<slot->bitmap.width; col++) { destScanLine[4*col+0] = color.blue(); destScanLine[4*col+1] = color.green(); destScanLine[4*col+2] = color.red(); destScanLine[4*col+3] = srcScanLine[col]; } srcScanLine += slot->bitmap.pitch; } } else { // If the alpha channel is not supported... QT seems to turn // the alpha channel into a crude bitmap which is used to mask // the resulting QPixmap. In this case, we define the // character outline using the image data, and use the alpha // channel only to store "maximally opaque" or "completely // transparent" values. When characters are rendered, // overlapping characters are no longer correctly drawn, but // quality is still sufficient for most purposes. One notable // exception is output from the gftodvi program, which will be // partially unreadable. Q_UINT16 rInv = 0xFF - color.red(); Q_UINT16 gInv = 0xFF - color.green(); Q_UINT16 bInv = 0xFF - color.blue(); for(Q_UINT16 y=0; y<slot->bitmap.rows; y++) { Q_UINT8 *srcScanLine = slot->bitmap.buffer + y*slot->bitmap.pitch; unsigned int *destScanLine = (unsigned int *)imgi.scanLine(y); for(Q_UINT16 col=0; col<slot->bitmap.width; col++) { Q_UINT16 data = *srcScanLine; // The value stored in "data" now has the following meaning: // data = 0 -> white; data = 0xff -> use "color" *destScanLine = qRgba(0xFF - (rInv*data + 0x7F) / 0xFF, 0xFF - (gInv*data + 0x7F) / 0xFF, 0xFF - (bInv*data + 0x7F) / 0xFF, (data > 0x03) ? 0xff : 0x00); destScanLine++; srcScanLine++; } } } g->shrunkenCharacter.convertFromImage (imgi, 0); g->x2 = -slot->bitmap_left; g->y2 = slot->bitmap_top; } } // Load glyph width, if that hasn't been done yet. if (g->dvi_advance_in_units_of_design_size_by_2e20 == 0) { int error = FT_Load_Glyph(face, charMap[ch], FT_LOAD_NO_SCALE); if (error) { QString msg = i18n("FreeType is unable to load metric for glyph #%1 from font file %2.").arg(ch).arg(parent->filename); if (errorMessage.isEmpty()) errorMessage = msg; kdError(4300) << msg << endl; g->dvi_advance_in_units_of_design_size_by_2e20 = 1; } g->dvi_advance_in_units_of_design_size_by_2e20 = (Q_INT32)(((Q_INT64)(1<<20) * (Q_INT64)face->glyph->metrics.horiAdvance) / (Q_INT64)face->units_per_EM); } return g; }