void build_gr_cum(const TRasterImageP &image, int cum[256]) { int lx, ly, wrap, true_lx, true_ly; int i, x, y; UCHAR *pix, *buffer; int histo[256], raster_is_savebox; get_virtual_buffer(image, &lx, &ly, &wrap, &buffer); for (i = 0; i < 256; i++) histo[i] = 0; for (y = 0; y < ly; y++) { pix = buffer + y * wrap; for (x = 0; x < lx; x++) histo[*pix++]++; } raster_is_savebox = 1; TRect saveBox = image->getSavebox(); if ((saveBox.getLx() > 0 && saveBox.getLx() < image->getRaster()->getLx()) || (saveBox.getLy() > 0 && saveBox.getLy() < image->getRaster()->getLy())) raster_is_savebox = 0; if (raster_is_savebox) { true_lx = saveBox.getLx() ? saveBox.getLx() : image->getRaster()->getLx(); true_ly = saveBox.getLy() ? saveBox.getLy() : image->getRaster()->getLy(); } else { true_lx = image->getRaster()->getLx(); true_ly = image->getRaster()->getLy(); } histo[255] += true_lx * true_ly - lx * ly; build_cum(histo, cum); }
bool TCleanupper::getResampleValues(const TRasterImageP &image, TAffine &aff, double &blur, TDimension &outDim, TPointD &outDpi, bool isCameraTest, bool &isSameDpi) { double outlp, outlq; double scalex, scaley; double cxin, cyin, cpout, cqout; double max_blur; TPointD dpi; // Locking the input image to be cleanupped image->getRaster()->lock(); // Retrieve image infos int rasterLx = image->getRaster()->getLx(); int rasterLy = image->getRaster()->getLy(); /*---入力画像サイズとSaveBoxのサイズが一致しているか?の判定---*/ TRect saveBox = image->getSavebox(); bool raster_is_savebox = true; if (saveBox == TRect() && (saveBox.getLx() > 0 && saveBox.getLx() < rasterLx || saveBox.getLy() > 0 && saveBox.getLy() < rasterLy)) raster_is_savebox = false; image->getDpi(dpi.x, dpi.y); if (dpi == TPointD()) { dpi = getCustomDpi(); if (dpi == TPointD()) dpi.x = dpi.y = 65.0; //using 65.0 as default DPI } else if (!dpi.x) dpi.x = dpi.y; else if (!dpi.y) dpi.y = dpi.x; // Retrieve some cleanup parameters int rotate = m_parameters->m_rotate; //Build scaling/dpi data { m_parameters->getOutputImageInfo(outDim, outDpi.x, outDpi.y); // input -> output scale factor scalex = outDpi.x / dpi.x; scaley = outDpi.y / dpi.y; outlp = outDim.lx; outlq = outDim.ly; } /*--- 拡大/縮小をしていない場合(DPIが変わらない場合)、NearestNeighborでリサンプリングする。---*/ isSameDpi = areAlmostEqual(outDpi.x, dpi.x, 0.1) && areAlmostEqual(outDpi.y, dpi.y, 0.1); // Retrieve input center if (raster_is_savebox) { cxin = -saveBox.getP00().x + (saveBox.getLx() - 1) / 2.0; cyin = -saveBox.getP00().y + (saveBox.getLy() - 1) / 2.0; } else { cxin = (rasterLx - 1) / 2.0; cyin = (rasterLy - 1) / 2.0; } // Retrieve output center cpout = (outlp - 1) / 2.0; cqout = (outlq - 1) / 2.0; // Perform autocenter if any is found double angle = 0.0; double skew = 0.0; TAffine pre_aff; image->getRaster()->lock(); bool autocentered = doAutocenter( angle, skew, cxin, cyin, cqout, cpout, dpi.x, dpi.y, raster_is_savebox, saveBox, image, scalex); image->getRaster()->unlock(); // Build the image transform as deduced by the autocenter if (m_parameters->m_autocenterType == AUTOCENTER_CTR && skew) { pre_aff.a11 = cos(skew * TConsts::pi_180); pre_aff.a21 = sin(skew * TConsts::pi_180); } aff = (TScale(scalex, scaley) * pre_aff) * TRotation(angle); aff = aff.place(cxin, cyin, cpout, cqout); // Apply eventual additional user-defined transforms TPointD pout = TPointD((outlp - 1) / 2.0, (outlq - 1) / 2.0); if (m_parameters->m_rotate != 0) aff = TRotation(-(double)m_parameters->m_rotate).place(pout, pout) * aff; if (m_parameters->m_flipx || m_parameters->m_flipy) aff = TScale(m_parameters->m_flipx ? -1 : 1, m_parameters->m_flipy ? -1 : 1).place(pout, pout) * aff; if (!isCameraTest) aff = TTranslation(m_parameters->m_offx * outDpi.x / 2, m_parameters->m_offy * outDpi.y / 2) * aff; max_blur = 20.0 * sqrt(fabs(scalex /*** * oversample_factor ***/)); blur = pow(max_blur, (100 - m_parameters->m_sharpness) / (100 - 1)); return autocentered; }