#include "FiveToSingle.h" #include #include #include #include #include #define BG_PATH_FORMAT ":/NameCreater/resource/background_%1.jpg" static QPointF BG_POS[] = { QPointF(159, 61), QPointF(482, 61), QPointF(802, 61), QPointF(1122, 61), QPointF(1449, 61), QPointF(1772, 61), QPointF(2095, 61), QPointF(2414, 61), QPointF(2738, 61), QPointF(3060, 61), QPointF(900, 2094), QPointF(900, 2420), }; static int BG_POS_COUNT = sizeof(BG_POS) / sizeof(BG_POS[0]); static QPointF NAME_POS[] = { QPointF(240, 430), QPointF(372, 1402), QPointF(564, 430), QPointF(694, 1402), QPointF(883, 430), QPointF(1014, 1402), QPointF(1205, 430), QPointF(1337, 1402), QPointF(1532, 430), QPointF(1663, 1402), QPointF(1854, 430), QPointF(1987, 1402), QPointF(2176, 430), QPointF(2309, 1402), QPointF(2498, 430), QPointF(2629, 1402), QPointF(2821, 430), QPointF(2952, 1402), QPointF(3145, 430), QPointF(3276, 1402), QPointF(1268, 2012), QPointF(2240, 1880), QPointF(1268, 2334), QPointF(2240, 2202), }; static QPointF NAME_POS_NUMBER[] = { QPointF(240, 370), QPointF(372, 1442), QPointF(564, 370), QPointF(694, 1442), QPointF(883, 370), QPointF(1014, 1442), QPointF(1205, 370), QPointF(1337, 1442), QPointF(1532, 370), QPointF(1663, 1442), QPointF(1854, 370), QPointF(1987, 1442), QPointF(2176, 370), QPointF(2309, 1442), QPointF(2498, 370), QPointF(2629, 1442), QPointF(2821, 370), QPointF(2952, 1442), QPointF(3145, 370), QPointF(3276, 1442), QPointF(1228, 2012), QPointF(2280, 1880), QPointF(1228, 2334), QPointF(2280, 2202), }; //static int NAME_POS_COUNT = sizeof(NAME_POS) / sizeof(NAME_POS[0]); FiveToSingle::FiveToSingle() :INameCreater() { } FiveToSingle::~FiveToSingle() { } QList FiveToSingle::getNameByFileContent(Name_Type_e type, const QByteArray& conetent) { QList nameList; QTextCodec* tc = QTextCodec::codecForName("Big5"); QString codec = tc->toUnicode(conetent.data()); QTextStream stream(&codec); int row = 0; while (!stream.atEnd()) { NameInfo_t info; QString line = stream.readLine(); QString name_tc = line; QStringList csvList = name_tc.split(','); QString name, eng_name, bg_type; switch (type) { case Name_zh: name = csvList.at(0); bg_type = csvList.at(1); break; case Name_zh_eng: name = csvList.at(0); eng_name = csvList.at(1); bg_type = csvList.at(2); break; case Name_eng: eng_name = csvList.at(0); bg_type = csvList.at(1); default: break; } qDebug() << "row :" << row << " " << name << ", eng: " << eng_name << ", bg_type: " << bg_type; if (name.compare("name_1") == 0 || eng_name.compare("eng_name") == 0) { //pass first line continue; } info.name1 = name; info.name_eng = eng_name; info.name2 = QString(BG_PATH_FORMAT).arg(bg_type); nameList.append(info); row++; } return nameList; } void FiveToSingle::generaImageFromCSV(Name_Type_e type, const QString& filename, const QByteArray& filecontent, const QFont& font, const QColor& font_color) { int export_times = 0; QList nameList = getNameByFileContent(type, filecontent); if (nameList.isEmpty()) { QMessageBox msgBox; msgBox.setText(QString("Name is empty ! ").append(filename)); msgBox.exec(); } QGraphicsScene scene; scene.setBackgroundBrush(QBrush(QColor(255, 255, 255))); QGraphicsView view(&scene); /*QImage image(BG_SAMPLE_PATH); QGraphicsPixmapItem* bgItem = new QGraphicsPixmapItem(QPixmap::fromImage(image)); scene.addItem(bgItem);*/ switch (type) { case Name_zh: { for (int n = 0; n < nameList.length(); n++) { int idx = n % BG_POS_COUNT; NameInfo_t name_info = nameList.at(n); QImage name_image(name_info.name2); if (idx == 0) { QGraphicsRectItem* bg_item = new QGraphicsRectItem(0, 0, BG_WIDTH, BG_HEIGHT); bg_item->setBrush(QBrush(QColor(255, 255, 255))); scene.addItem(bg_item); } QGraphicsPixmapItem* name_bgItem = new QGraphicsPixmapItem(QPixmap::fromImage(name_image)); bool rot = (idx == 10 || idx == 11); name_bgItem->setRotation(rot ? -90 : 0); name_bgItem->setPos(BG_POS[idx]); scene.addItem(name_bgItem); if (name_info.name1.isEmpty()) { QMessageBox msgBox; msgBox.setText(QString().asprintf("Name is Empty at %d", export_times + 1)); msgBox.exec(); } QString name = name_info.name1; int name_len = name.length(); for (int j = 0; j < 2; j++) { int pos_idx = idx * 2 + j; qreal xscale, yscale; xscale = yscale = (j == 1) ? -1 : 1; QPointF pos = name_info.is_number_bg ? NAME_POS_NUMBER[pos_idx] : NAME_POS[pos_idx]; qreal y_offset[2] = { 0 }; if (name_len == 2) { if (!rot) { pos.setY(pos.y() + 82.0 * xscale); } else { pos.setX(pos.x() + 82.0 * xscale); } y_offset[0] = 25; } QGraphicsTextItem* textItem1 = new QGraphicsTextItem(name.mid(0, 1)); textItem1->setFont(font); textItem1->setDefaultTextColor(font_color); if (!rot) { textItem1->setPos(pos); textItem1->setTransform(QTransform::fromScale(xscale, yscale)); } else { textItem1->setPos(pos); textItem1->setRotation(-90); textItem1->setTransform(QTransform::fromScale(xscale, yscale)); } scene.addItem(textItem1); QGraphicsTextItem* textItem2 = new QGraphicsTextItem(name.mid(1, 1)); textItem2->setFont(font); textItem2->setDefaultTextColor(font_color); if (!rot) { textItem2->setPos(pos.x(), pos.y() + (145 + y_offset[0]) * xscale); textItem2->setTransform(QTransform::fromScale(xscale, yscale)); } else { textItem2->setPos(pos.x() + (145 + y_offset[0]) * xscale, pos.y()); textItem2->setRotation(-90); textItem2->setTransform(QTransform::fromScale(xscale, yscale)); } scene.addItem(textItem2); if (name_len > 2) { QGraphicsTextItem* textItem3 = new QGraphicsTextItem(name.mid(2, 1)); textItem3->setFont(font); textItem3->setDefaultTextColor(font_color); if (!rot) { textItem3->setPos(pos.x(), pos.y() + 290 * xscale); textItem3->setTransform(QTransform::fromScale(xscale, yscale)); } else { textItem3->setPos(pos.x() + 290 * xscale, pos.y()); textItem3->setRotation(-90); textItem3->setTransform(QTransform::fromScale(xscale, yscale)); } scene.addItem(textItem3); } } bool is_export_page = ((idx + 1) % BG_POS_COUNT == 0); if (is_export_page || n == nameList.count() - 1) { QString date_str = QDateTime::currentDateTime().toString("MMddhhmm"); QString file_name = QString("Signal_%2_%1.jpg").arg(QString::number(export_times + 1), date_str); saveToImage(file_name, &scene); export_times++; scene.clear(); } } } break; case Name_zh_eng: { QFont _new_font = QFont(this->EnglisthFont()); _new_font.setWeight(QFont::ExtraLight); for (int n = 0; n < nameList.length(); n++) { int idx = n % BG_POS_COUNT; NameInfo_t name_info = nameList.at(n); QImage name_image(name_info.name2); if (idx == 0) { QGraphicsRectItem* bg_item = new QGraphicsRectItem(0, 0, BG_WIDTH, BG_HEIGHT); bg_item->setBrush(QBrush(QColor(255, 255, 255))); scene.addItem(bg_item); } QGraphicsPixmapItem* name_bgItem = new QGraphicsPixmapItem(QPixmap::fromImage(name_image)); bool rot = (idx == 10 || idx == 11); name_bgItem->setRotation(rot ? -90 : 0); name_bgItem->setPos(BG_POS[idx]); scene.addItem(name_bgItem); if (name_info.name1.isEmpty()) { QMessageBox msgBox; msgBox.setText(QString().asprintf("Name is Empty at %d", export_times + 1)); msgBox.exec(); } QString name = name_info.name1; int name_len = name.length(); for (int j = 0; j < 2; j++) { int pos_idx = idx * 2 + j; QPointF pos = name_info.is_number_bg ? NAME_POS_NUMBER[pos_idx] : NAME_POS[pos_idx]; if (j == 0) { qreal xscale, yscale; xscale = yscale = 1; qreal y_offset[2] = { 0 }; if (name_len == 2) { if (!rot) { pos.setY(pos.y() + 82.0 * xscale); } else { pos.setX(pos.x() + 82.0 * xscale); } y_offset[0] = 25; } QGraphicsTextItem* textItem1 = new QGraphicsTextItem(name.mid(0, 1)); textItem1->setFont(font); textItem1->setDefaultTextColor(font_color); if (!rot) { textItem1->setPos(pos); textItem1->setTransform(QTransform::fromScale(xscale, yscale)); } else { textItem1->setPos(pos); textItem1->setRotation(-90); textItem1->setTransform(QTransform::fromScale(xscale, yscale)); } scene.addItem(textItem1); QGraphicsTextItem* textItem2 = new QGraphicsTextItem(name.mid(1, 1)); textItem2->setFont(font); textItem2->setDefaultTextColor(font_color); if (!rot) { textItem2->setPos(pos.x(), pos.y() + (145 + y_offset[0]) * xscale); textItem2->setTransform(QTransform::fromScale(xscale, yscale)); } else { textItem2->setPos(pos.x() + (145 + y_offset[0]) * xscale, pos.y()); textItem2->setRotation(-90); textItem2->setTransform(QTransform::fromScale(xscale, yscale)); } scene.addItem(textItem2); if (name_len > 2) { QGraphicsTextItem* textItem3 = new QGraphicsTextItem(name.mid(2, 1)); textItem3->setFont(font); textItem3->setDefaultTextColor(font_color); if (!rot) { textItem3->setPos(pos.x(), pos.y() + 290 * xscale); textItem3->setTransform(QTransform::fromScale(xscale, yscale)); } else { textItem3->setPos(pos.x() + 290 * xscale, pos.y()); textItem3->setRotation(-90); textItem3->setTransform(QTransform::fromScale(xscale, yscale)); } scene.addItem(textItem3); } } else if (j == 1) { //TODO: add English world QGraphicsTextItem* eng_word_item = new QGraphicsTextItem(name_info.name_eng); int _new_size = getFontSizebyStr(_new_font, 120, 480, name_info.name_eng); _new_font.setPixelSize(_new_size); eng_word_item->setFont(_new_font); QRectF rect = eng_word_item->boundingRect(); eng_word_item->setDefaultTextColor(font_color); if (!rot) { eng_word_item->setRotation(-90); eng_word_item->setPos(pos.x() + 20 - rect.height(), (pos.y() - 200) + rect.width() / 2); scene.addItem(eng_word_item); } else { eng_word_item->setRotation(0); // using window and webassembly complier that different y pos //widows complier //eng_word_item->setPos(pos.x() - 160 - rect.height(), pos.y()- 15); //webassembly complier eng_word_item->setPos(pos.x() - 160 - rect.height(), pos.y()+10); scene.addItem(eng_word_item); } } } bool is_export_page = ((idx + 1) % BG_POS_COUNT == 0); if (is_export_page || n == nameList.count() - 1) { QString date_str = QDateTime::currentDateTime().toString("MMddhhmm"); QString file_name = QString("Signal_%2_%1.jpg").arg(QString::number(export_times + 1), date_str); saveToImage(file_name, &scene); export_times++; scene.clear(); } } } break; default: break; } QMessageBox msgBox; msgBox.setText(QString().asprintf("Export Finshed. Count:%d", export_times)); msgBox.exec(); }