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) {
|
||||
|
||||
@@ -207,7 +207,7 @@ private:
|
||||
void addTimeoutView();
|
||||
void showPartnerSites();
|
||||
void sendImage();
|
||||
void imageUploaded(Wt::WFileUpload *fileWidget, std::shared_ptr<Magick::Image> localImage, Wt::WImage *image, Wt::WPushButton *okButton);
|
||||
void imageUploaded(Wt::WFileUpload *fileWidget, std::shared_ptr<Magick::Blob> localImage, Wt::WImage *image, Wt::WPushButton *okButton);
|
||||
bool isAnimatedGIF(const Magick::Blob &blob);
|
||||
};
|
||||
|
||||
|
||||
@@ -255,7 +255,7 @@ Wt::Json::Object Broadcast::addMessage(std::string fromSessionId, std::string to
|
||||
};
|
||||
}
|
||||
|
||||
Wt::Json::Object Broadcast::addImage(std::string fromSessionId, std::string toUserName, std::shared_ptr<Magick::Image> image) {
|
||||
Wt::Json::Object Broadcast::addImage(std::string fromSessionId, std::string toUserName, std::shared_ptr<Magick::Blob> image) {
|
||||
auto message = Message(fromSessionId, image);
|
||||
return addMessage(fromSessionId, toUserName, message);
|
||||
}
|
||||
@@ -658,7 +658,7 @@ Broadcast::Message::Message(std::string fromSessionId_, Wt::WString message_):
|
||||
sendTime = Wt::WDateTime::currentDateTime();
|
||||
}
|
||||
|
||||
Broadcast::Message::Message(std::string fromSessionId_, std::shared_ptr<Magick::Image> image_):
|
||||
Broadcast::Message::Message(std::string fromSessionId_, std::shared_ptr<Magick::Blob> imageBlob):
|
||||
fromSessionId(fromSessionId_),
|
||||
sendType("image") {
|
||||
auto timestamp = std::time(nullptr);
|
||||
@@ -667,12 +667,12 @@ Broadcast::Message::Message(std::string fromSessionId_, std::shared_ptr<Magick::
|
||||
auto hash = hashObj.compute(combinedString, "salt");
|
||||
messageId = Wt::WString(hash);
|
||||
sendTime = Wt::WDateTime::currentDateTime();
|
||||
Magick::Blob imageBlob;
|
||||
image_->write(&imageBlob);
|
||||
Magick::Image image_;
|
||||
image_.read(*imageBlob);
|
||||
image = {
|
||||
{"width", Wt::Json::Value((int)image_->columns())},
|
||||
{"height", Wt::Json::Value((int)image_->rows())},
|
||||
{"imageblobbase64", Wt::Json::Value(imageBlob.base64())}
|
||||
{"width", Wt::Json::Value((int)image_.columns())},
|
||||
{"height", Wt::Json::Value((int)image_.rows())},
|
||||
{"imageblobbase64", Wt::Json::Value(imageBlob->base64())}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
namespace Magick {
|
||||
class Image;
|
||||
class Blob;
|
||||
}
|
||||
|
||||
struct ConversationItem {
|
||||
@@ -50,7 +51,7 @@ public:
|
||||
struct Message {
|
||||
Message()= default;
|
||||
Message(std::string fromSessionId_, Wt::WString message_);
|
||||
Message(std::string fromSessionId_, std::shared_ptr<Magick::Image> image_);
|
||||
Message(std::string fromSessionId_, std::shared_ptr<Magick::Blob> image_);
|
||||
Message(Wt::WString message_);
|
||||
bool systemMessage{false};
|
||||
std::string fromSessionId;
|
||||
@@ -86,7 +87,7 @@ public:
|
||||
Wt::WString getCountryIsoCodeByCountry(Wt::WString country);
|
||||
std::list<Wt::Json::Object> getBroadcastsForSession(std::string sessionId);
|
||||
Wt::Json::Object addMessage(std::string fromSessionId, std::string toUserName, Message message);
|
||||
Wt::Json::Object addImage(std::string fromSessionId, std::string toUserName, std::shared_ptr<Magick::Image> image);
|
||||
Wt::Json::Object addImage(std::string fromSessionId, std::string toUserName, std::shared_ptr<Magick::Blob> image);
|
||||
void setConversationRead(std::string readingUserSessionId, std::string secondUserName);
|
||||
void sendConversation(std::string sessionId1, std::string userName2);
|
||||
void sendOpenConversations(std::string forSessionId);
|
||||
|
||||
Reference in New Issue
Block a user