pic upload
This commit is contained in:
63
src/app.cpp
63
src/app.cpp
@@ -39,6 +39,7 @@
|
||||
#include <Wt/WGridLayout.h>
|
||||
#include <Wt/WCheckBox.h>
|
||||
#include <Wt/WTimer.h>
|
||||
#include <Wt/WResource.h>
|
||||
|
||||
App::App(const Wt::WEnvironment &env, Broadcast &server):
|
||||
Wt::WApplication(env),
|
||||
@@ -446,7 +447,7 @@ void App::sendImage() {
|
||||
auto image = layout->addNew<Wt::WImage>();
|
||||
image->setMaximumSize(Wt::WLength(100, Wt::LengthUnit::Pixel), Wt::WLength(100, Wt::LengthUnit::Pixel));
|
||||
image->setHeight(Wt::WLength::Auto);
|
||||
auto localImage = std::make_shared<Magick::Image>();
|
||||
auto localImage = std::make_shared<Magick::Blob>();
|
||||
auto buttonsContainer = layout->addNew<Wt::WContainerWidget>();
|
||||
auto okButton = buttonsContainer->addNew<Wt::WPushButton>("Send image");
|
||||
fileWidget->uploaded().connect([=, this]() mutable {
|
||||
@@ -466,29 +467,33 @@ void App::sendImage() {
|
||||
fileDialog->show();
|
||||
}
|
||||
|
||||
void App::imageUploaded(Wt::WFileUpload *fileWidget, std::shared_ptr<Magick::Image> localImage, Wt::WImage *image, Wt::WPushButton *okButton) {
|
||||
void App::imageUploaded(Wt::WFileUpload *fileWidget, std::shared_ptr<Magick::Blob> localImage, Wt::WImage *image, Wt::WPushButton *okButton) {
|
||||
try {
|
||||
std::list<Magick::Image> originalImages;
|
||||
Magick::readImages(&originalImages, fileWidget->spoolFileName());
|
||||
std::list<Magick::Image> coalescedList;
|
||||
Magick::coalesceImages(&coalescedList, originalImages.begin(), originalImages.end());
|
||||
Magick::Image coalescedImage;
|
||||
Magick::Blob coalescedBlob;
|
||||
Magick::writeImages(coalescedList.begin(), coalescedList.end(), &coalescedBlob);
|
||||
coalescedImage.read(coalescedBlob);
|
||||
*localImage = coalescedImage;
|
||||
Magick::Blob previewBlob;
|
||||
coalescedImage.write(&previewBlob);
|
||||
Magick::writeImages(coalescedList.begin(), coalescedList.end(), &previewBlob);
|
||||
auto previewBase64 = previewBlob.base64();
|
||||
auto previewImage = Wt::Utils::base64Decode(previewBase64);
|
||||
std::string imageFormat = coalescedImage.magick();
|
||||
std::list<Magick::Image> previewList;
|
||||
std::list<Magick::Image> localList;
|
||||
std::transform(originalImages.begin(), originalImages.end(), std::back_inserter(previewList), [](const Magick::Image& img) { return img; });
|
||||
std::transform(originalImages.begin(), originalImages.end(), std::back_inserter(localList), [](const Magick::Image& img) { return img; });
|
||||
Magick::coalesceImages(&previewList, previewList.begin(), previewList.end());
|
||||
Magick::coalesceImages(&localList, localList.begin(), localList.end());
|
||||
auto resize = [](std::string size, std::list<Magick::Image> &imagesList) {
|
||||
for (auto &frame : imagesList) {
|
||||
frame.resize(size);
|
||||
}
|
||||
};
|
||||
resize("100x100^", previewList);
|
||||
resize("500x500^", localList);
|
||||
Magick::Blob resizedBlob;
|
||||
Magick::writeImages(previewList.begin(), previewList.end(), &resizedBlob);
|
||||
Magick::writeImages(localList.begin(), localList.end(), &(*localImage));
|
||||
auto resizedBase64 = resizedBlob.base64();
|
||||
auto resizedImageString = Wt::Utils::base64Decode(resizedBase64);
|
||||
std::string imageFormat = previewList.front().magick();
|
||||
auto imageResource = std::make_shared<Wt::WMemoryResource>(
|
||||
"image/" + imageFormat,
|
||||
std::vector<unsigned char>(previewImage.begin(), previewImage.end()));
|
||||
std::vector<unsigned char>(resizedImageString.begin(), resizedImageString.end()));
|
||||
image->setImageLink(Wt::WLink(imageResource));
|
||||
image->resize(Wt::WLength(localImage->columns(), Wt::LengthUnit::Pixel), Wt::WLength(localImage->rows(), Wt::LengthUnit::Pixel));
|
||||
std::cout << __LINE__ << std::endl;
|
||||
okButton->setEnabled(true);
|
||||
triggerUpdate();
|
||||
} catch (const std::exception& e) {
|
||||
@@ -496,6 +501,8 @@ void App::imageUploaded(Wt::WFileUpload *fileWidget, std::shared_ptr<Magick::Ima
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Magick::Image App::scaleImage(const Magick::Image& originalImage, int maxSize) const {
|
||||
int scale = 100;
|
||||
int maxDimension = std::max(originalImage.size().width(), originalImage.size().height());
|
||||
@@ -662,19 +669,32 @@ void App::createImprintContainer(Wt::WVBoxLayout *containerLayout) {
|
||||
|
||||
Wt::WWebWidget* App::createImageElement(Wt::Json::Object& line, const std::string& writer, Wt::WContainerWidget* outputContainer, std::string id) {
|
||||
Wt::Json::Object imageDescription = line["image"];
|
||||
std::cout << __LINE__ << std::endl;
|
||||
auto imageLineItem = outputContainer->addNew<Wt::WContainerWidget>();
|
||||
std::cout << __LINE__ << std::endl;
|
||||
auto outputText = Wt::WString("<b>{1}:</b> ").arg(writer);
|
||||
std::cout << __LINE__ << std::endl;
|
||||
imageLineItem->addNew<Wt::WText>(outputText)->setStyleClass("output-line");
|
||||
std::cout << __LINE__ << std::endl;
|
||||
auto image = imageLineItem->addNew<Wt::WImage>();
|
||||
auto imageBlob = Wt::Utils::base64Decode((std::string)imageDescription["imageblobbase64"]);
|
||||
std::cout << __LINE__ << std::endl;
|
||||
std::string base64Data = (std::string)imageDescription["imageblobbase64"];
|
||||
std::string decodedData = Wt::Utils::base64Decode(base64Data); // Decode Base64 data
|
||||
Magick::Blob imageBlob(decodedData.data(), decodedData.size());
|
||||
Magick::Image magickImage;
|
||||
magickImage.read(imageBlob);
|
||||
std::string imageFormat = magickImage.magick();
|
||||
std::cout << __LINE__ << std::endl;
|
||||
std::cout << imageFormat << std::endl;
|
||||
Magick::Blob blob;
|
||||
magickImage.write(&blob);
|
||||
auto resizedBase64 = blob.base64();
|
||||
auto resizedImageString = Wt::Utils::base64Decode(resizedBase64);
|
||||
auto imageResource = std::make_shared<Wt::WMemoryResource>(
|
||||
"image/" + imageFormat,
|
||||
std::vector<unsigned char>(imageBlob.begin(), imageBlob.end()));
|
||||
std::vector<unsigned char>(resizedImageString.begin(), resizedImageString.end())); // Verwenden Sie den direkt decodierten Inhalt
|
||||
std::cout << __LINE__ << std::endl;
|
||||
image->setImageLink(Wt::WLink(imageResource));
|
||||
image->resize(Wt::WLength((int)imageDescription["width"], Wt::LengthUnit::Pixel), Wt::WLength((int)imageDescription["height"], Wt::LengthUnit::Pixel));
|
||||
imageLineItem->setAttributeValue("dummy", id);
|
||||
return imageLineItem;
|
||||
}
|
||||
@@ -767,7 +787,6 @@ void App::updateUserinfo(Wt::Json::Object data) {
|
||||
auto infoWidgetLayout = (Wt::WHBoxLayout*)infoWidget->layout();
|
||||
auto infoTextWidget = dynamic_cast<Wt::WText*>(infoWidgetLayout->itemAt(1)->widget());
|
||||
auto blockButton = dynamic_cast<Wt::WPushButton*>(infoWidgetLayout->itemAt(2)->widget());
|
||||
std::cout << Wt::Json::serialize(userData) << std::endl;
|
||||
try {
|
||||
infoWidget->setStyleClass(Wt::WString("user-conversation-info userlist-gender-{1}").arg((std::string)userData["gender"]));
|
||||
if (infoTextWidget) {
|
||||
|
||||
Reference in New Issue
Block a user