Files
KJD_WebService/TEMUKJD/ToolForms/DouBaoImgCefForm.cs
T

543 lines
23 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using AllBase;
using AllBase.Model.Result;
using AllBase.Model.Result.TemuResult;
using CefSharp;
using CefSharp.WinForms;
using NaiBa.Util.Extension;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using TemuKJD.BaseForms;
using TemuKJD.Helper;
using TemuKJD.KJDForms.ProductSelectForms;
using Work;
using Work.BLL.Tools;
namespace TemuKJD.ToolForms
{
public partial class DouBaoImgCefForm : LRBaseForm
{
ChromiumWebBrowser cefWebBrowser = null;
KJDDBProduct dbProd = null;
string Url { get; set; } = "https://www.doubao.com/chat/";
List<Cookie> Cookies = new List<Cookie>();
public DouBaoImgCefForm(KJDDBProduct _dbProd, string url = "", List<Cookie> cookies = null)
{
InitializeComponent();
if (_dbProd != null)
dbProd = _dbProd;
if (!string.IsNullOrEmpty(url))
Url = url;
if (cookies != null)
Cookies = cookies;
this.Width = Math.Min(1600, Screen.PrimaryScreen.Bounds.Width);
this.Height = Math.Min(900, Screen.PrimaryScreen.Bounds.Height);
this.StartPosition = FormStartPosition.CenterScreen;
}
private void DouBaoCefForm_Load(object sender, EventArgs e)
{
cefWebBrowser = NaiBa.CefHelper.CEFBrowser.CreateChromiumWebBrowser(Url);
cefWebBrowser.AutoSize = true;
cefWebBrowser.Dock = DockStyle.Fill;
//cefWebBrowser.RequestContext = new RequestContext(requestContextSettings);
cefWebBrowser.KeyboardHandler = new KJDForms.ToolForms.CefKeyboardHandler();
cefWebBrowser.FrameLoadEnd += CefWebBrowser_FrameLoadEnd;
cefWebBrowser.AddressChanged += CefWebBrowser_AddressChanged;
CustomDownloadHandler downloadHandler = new CustomDownloadHandler();
downloadHandler.DownloadCompleteEvent += DownloadHandler_DownloadComplete;
cefWebBrowser.DownloadHandler = downloadHandler;
panel2.Controls.Add(cefWebBrowser);
this.splitContainer3.Panel2.Controls.Clear();
if (BaseClass.MainPath=="kuajingda")
{
try
{
var temuDBProd = DbProductSelectListManageForm.GetProductDetail(dbProd.id.ToString());
if (temuDBProd == null || temuDBProd.id == 0)
{
BaseMsgForm.ShowError("商品已清除!");
return;
}
dbProd = temuDBProd;
var prodInfo = JsonHelper.DeserializeJsonToObject<TemuDetailProductInfo>(dbProd.product_json);
var ucImgChangeList = new List<UcSkuImgItem>();
this.TitleText = "豆包生成SKU图 主店ID:" + prodInfo.supplierId.ParseToString() + " SKC:" + prodInfo.productSkcList.FirstOrDefault()?.productSkcId +
" SPU:" + prodInfo.productId + " 名称:" + prodInfo.productName;
this.txtShopId.Text = "主店ID:" + prodInfo.supplierId.ParseToString();
this.txtSpuId.Text = "SPU:" + prodInfo.productId.ParseToString();
this.txtSkcId.Text = "SKC:" + prodInfo.productSkcList.FirstOrDefault()?.productSkcId.ParseToString();
foreach (var sku in prodInfo.productSkcList[0].productSkuList)
{
var imgUrl = sku.thumbUrl.Replace("https://", "http://");
if (!ucImgChangeList.Any(p=>p.pbSkuOriginalImg.ImageLocation == imgUrl))
{
UcSkuImgItem skuImgItem = new UcSkuImgItem(prodInfo.productId.ParseToLong(), sku.productSkuSpecList[0].specId.ParseToLong(),
sku.productSkuSpecList[0].specName, imgUrl);
skuImgItem.pbSkuOriginalImg.ImageLocation = imgUrl;
skuImgItem.pbSkuOriginalImg.Tag = "{\"productId\":" + prodInfo.productId +
",\"skuId\":" + sku.productSkuId +
",\"specId\":" + sku.productSkuSpecList[0].specId +
",\"specName\":\"" + sku.productSkuSpecList[0].specName + "\"}";
skuImgItem.pbSkuOriginalImg.Name = sku.productSkuId.ToString();
skuImgItem.chkSpecName.Text = sku.productSkuSpecList[0].specName + " " + sku.productSkuSpecList[0].specId;
skuImgItem.chkSpecName.Tag = skuImgItem;
skuImgItem.chkSpecName.CheckedChanged += ChkSpecName_CheckedChanged;
skuImgItem.btnGetOriginalImg.Tag = skuImgItem;
skuImgItem.btnGetOriginalImg.Click += btnGetOriginalImg_Click;
skuImgItem.btnUploadImg.Tag = skuImgItem;
skuImgItem.btnUploadImg.Click += btnUploadImg_Click;
skuImgItem.pbSkuOriginalImg.Tag = skuImgItem;
skuImgItem.pbSkuOriginalImg.Click += pbSkuOriginalImg_Click;
skuImgItem.pbSkuImg.Tag = skuImgItem;
skuImgItem.pbSkuImg.Click += PbSkuImg_Click;
skuImgItem.Dock = DockStyle.Top;
ucImgChangeList.Add(skuImgItem);
this.splitContainer3.Panel2.Controls.Add(skuImgItem);
}
}
pbLoading.Visible = true;
pbLoading.BringToFront();
pbLoading2.Visible = true;
pbLoading2.BringToFront();
Task.Run(() =>
{
foreach (Control c in this.splitContainer3.Panel2.Controls)
{
var skuImgItem = c as UcSkuImgItem;
if (skuImgItem == null)
continue;
List<AiSkuImgInfo> skuImgLst = new List<AiSkuImgInfo>();
int page = 1;
int pageSize = 5;
var skuImgLstTmp = GetSkuImgList(skuImgItem.ProdId.ParseToString(), skuImgItem.SpecId.ParseToString(), pageSize, false, page);
skuImgLst.AddRange(skuImgLstTmp);
while (skuImgLstTmp.Count >= pageSize)
{
page++;
skuImgLstTmp = GetSkuImgList(skuImgItem.ProdId.ParseToString(), skuImgItem.SpecId.ParseToString(), pageSize, false, page);
skuImgLst.AddRange(skuImgLstTmp);
}
skuImgItem.LstSkuImgInfo = skuImgLst;
if (skuImgLst.Count > 0)
{
var skuImgInfo = skuImgLst.First();
Invoke(new Action(() =>
{
//if (!string.IsNullOrWhiteSpace(skuImgInfo.img_url))
// skuImgItem.pbSkuImg.ImageLocation = skuImgInfo.img_url.Replace("img.kwcdn.com", "img.cdnfe.com").Replace("https://", "http://");
//else
if (!string.IsNullOrWhiteSpace(skuImgInfo.img_base64))
skuImgItem.pbSkuImg.Image = Base64ChangeImgUrl.Base64ToImage(skuImgInfo.img_base64);
}));
}
}
Invoke(new Action(() =>
{
pbLoading.Visible = false;
pbLoading2.Visible = false;
}));
});
}
catch (Exception ex)
{
BaseMsgForm.ShowError(ex.Message);
}
}
}
private void ChkSpecName_CheckedChanged(object sender, EventArgs e)
{
var chk = sender as UserComponent.UcCheckBox;
if (chk == null)
return;
var skuImgItem = chk.Tag as UcSkuImgItem;
if (skuImgItem == null)
return;
if (skuImgItem.chkSpecName.Checked)
SetCurrentSkuImgItem(skuImgItem);
}
private void DownloadHandler_DownloadComplete(object browser, DownloadItem downloadItem)
{
//BaseMsgForm.ShowInfo(downloadItem.FullPath + "下载完成");
Invoke(new Action(() =>
{
if(currentSkuImgItem == null)
{
BaseMsgForm.ShowInfo("当前未选择sku,点击选择sku再下载,图片将直接上传到服务端!");
this.lblMsg.Text = downloadItem.FullPath + "下载完成";
}
else
{
if (UpdateSkuImg(currentSkuImgItem, downloadItem.FullPath))
{
this.lblMsg.Text = downloadItem.FullPath + "下载并上传服务端完成";
}
else
{
this.lblMsg.Text = downloadItem.FullPath + "下载完成";
}
}
this.pnlMsg.Visible = true;
}));
Task.Run(() =>
{
Thread.Sleep(2000);
Invoke(new Action(() =>
{
this.pnlMsg.Visible = false;
}));
});
}
public static List<AiSkuImgInfo> GetSkuImgList(string prodId, string specId, int pageSize = 50, bool isRandom = false, int page = 1)
{
var url = BaseClass.BuildObjString("product/get_sku_image_list");
var data = UserLogin.GetSignaturex();
data += "&search_product_id=" + prodId;
data += "&search_spec_id=" + specId;
data += "&page_size=" + pageSize;
data += "&page=" + page;
if (isRandom)
{
data += "&is_random=true";
}
var html = GetHtml.PostUtf8(url, data);
if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200"))
html = GetHtml.PostUtf8(url, data);
if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200"))
html = GetHtml.PostUtf8(url, data);
if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200"))
{
BaseMsgForm.ShowError("SKU图片查询失败,请重试!" + BaseRegex.GetStringJson(ref html, "msg"));
return new List<AiSkuImgInfo>();
}
else
{
try
{
JObject jObj = JObject.Parse(html);
return JsonHelper.DeserializeJsonToList<AiSkuImgInfo>(jObj["data"].ToString());
}
catch(Exception ex)
{
BaseMsgForm.ShowError("SKU图片查询失败,请重试!" + ex.Message);
return new List<AiSkuImgInfo>();
}
}
}
private void pbSkuOriginalImg_Click(object sender, EventArgs e)
{
var pb = sender as PictureBox;
if (pb == null)
return;
if (!string.IsNullOrEmpty(pb.ImageLocation))
{
ShowImgForm imgFrom = new ShowImgForm(pb.ImageLocation);
imgFrom.ShowDialog();
}
else
{
ShowImgForm imgFrom = new ShowImgForm(pb.Image);
imgFrom.ShowDialog();
}
var skuImgItem = pb.Tag as UcSkuImgItem;
if (skuImgItem == null)
return;
//SetCurrentSkuImgItem(skuImgItem);
}
private void PbSkuImg_Click(object sender, EventArgs e)
{
var pb = sender as PictureBox;
if (pb == null)
return;
var skuImgItem = pb.Tag as UcSkuImgItem;
if (skuImgItem == null)
return;
//SetCurrentSkuImgItem(skuImgItem);
DouBaoImgListForm imgLstForm = new DouBaoImgListForm(skuImgItem.LstSkuImgInfo);
imgLstForm.ShowDialog();
var imgInfo = skuImgItem.LstSkuImgInfo.FirstOrDefault();
if (imgInfo == null)
{
skuImgItem.pbSkuImg.Image = Properties.Resources.nopic;
}
else
{
if (!string.IsNullOrWhiteSpace(imgInfo.img_url))
skuImgItem.pbSkuImg.ImageLocation = imgInfo.img_url;
else if (!string.IsNullOrWhiteSpace(imgInfo.img_base64))
skuImgItem.pbSkuImg.Image = Base64ChangeImgUrl.Base64ToImage(imgInfo.img_base64);
}
}
private void btnGetOriginalImg_Click(object sender, EventArgs e)
{
var pnl = sender as DevComponents.DotNetBar.PanelEx;
if (pnl == null)
return;
var skuImgItem = pnl.Tag as UcSkuImgItem;
if (skuImgItem == null)
return;
SetCurrentSkuImgItem(skuImgItem);
var pb = skuImgItem.pbSkuOriginalImg;
if (pb.Image == null)
{
BaseMsgForm.ShowError("图片为空!");
return;
}
string fileName = DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss") + ".jpg";
if (!string.IsNullOrEmpty(pb.ImageLocation))
{
fileName = pb.ImageLocation.Replace("://", ".").Replace('/', '.');
}
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "JPeg Image|*.jpg;*.jpeg";
sfd.Title = "保存图片";
sfd.FileName = fileName;
if (sfd.ShowDialog() == DialogResult.OK)
{
pb.Image.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
private void btnUploadImg_Click(object sender, EventArgs e)
{
var pnl = sender as DevComponents.DotNetBar.PanelEx;
if (pnl == null)
return;
var skuImgItem = pnl.Tag as UcSkuImgItem;
if (skuImgItem == null)
return;
SetCurrentSkuImgItem(skuImgItem);
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Multiselect = false;
// 设置过滤条件,只显示文本文件
openFileDialog.Filter = "图片文件 (*.jpeg;*.jpg;*.png)|*.jpeg;*.jpg;*.png|All files (*.*)|*.*";
// 显示对话框并获取结果
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
string filePath = openFileDialog.FileName;
UpdateSkuImg(skuImgItem, filePath);
}
}
bool UpdateSkuImg(UcSkuImgItem skuImgItem, string filePath)
{
try
{
Image image = Image.FromFile(filePath);
ImageBuild ib = null;
using (MemoryStream memoryStream = new MemoryStream())
{
image.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] imageBytes = memoryStream.ToArray();
ib = new ImageBuild(imageBytes);
}
var newImgBytes = ib.BuildNewSize(800, 800, 85);
Bitmap bitmap = null;
using (MemoryStream ms = new MemoryStream(newImgBytes))
{
//skuImgItem.pictureBox2.Image = Image.FromStream(ms);
// 将image转成bitmap以后使用才能释放生成MemoryStream,否则保存Image对象到文件会产生GDI+中发生一般性错误
bitmap = new Bitmap(Image.FromStream(ms));
// 打码,打上马赛克
var x = txtXPos.Text.ParseToInt();
var y = txtYPos.Text.ParseToInt();
var cx = txtXSize.Text.ParseToInt();
var cy = txtYSize.Text.ParseToInt();
//bitmap = ApplyMosaicEffect(bitmap, new Rectangle(665, 740, 125, 50), 25);
bitmap = ApplyMosaicEffect(bitmap, new Rectangle(x, y, cx, cy), 60);
//skuImgItem.pictureBox2.Image = bitmap;
}
string imgBase64 = "";
using (MemoryStream memoryStream = new MemoryStream())
{
bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] imageBytes = memoryStream.ToArray();
imgBase64 = Convert.ToBase64String(imageBytes);
}
string img_md5 = BaseClass.GetMd5(imgBase64);
var url = BaseClass.BuildObjString("product/add_sku_image");
var data = UserLogin.GetSignaturex();
data += "&img_base64=" + imgBase64;
data += "&img_md5=" + img_md5;
data += "&product_id=" + skuImgItem.ProdId;
data += "&spec_id=" + skuImgItem.SpecId;
data += "&spec_name=" + skuImgItem.SpecName;
data += "&original_img_url=" + skuImgItem.SpecImgUrl;
data += "&original_img_url_md5=" + BaseClass.GetMd5(skuImgItem.SpecImgUrl);
var html = GetHtml.PostUtf8(url, data);
if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200"))
html = GetHtml.PostUtf8(url, data);
if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200"))
html = GetHtml.PostUtf8(url, data);
if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200"))
{
BaseMsgForm.ShowError("sku图片上传服务端失败,请重试!" + BaseRegex.GetStringJson(ref html, "msg"));
return false;
}
else
{
skuImgItem.LstSkuImgInfo.Insert(0, new AiSkuImgInfo()
{
id = BaseRegex.GetIntJson(ref html, "sku_img_id"),
add_time = DateTime.Now,
mdy_time = DateTime.Now,
img_base64 = imgBase64,
img_base64_db_id = BaseRegex.GetIntJson(ref html, "sku_img_Base64_id"),
img_md5 = img_md5,
img_url = "",
original_img_url = skuImgItem.SpecImgUrl,
product_id = skuImgItem.ProdId.ParseToString(),
spec_id = skuImgItem.SpecId.ParseToString(),
spec_name = skuImgItem.SpecName,
});
skuImgItem.pbSkuImg.Image = bitmap;
}
return true;
}
catch (Exception ex)
{
BaseMsgForm.ShowError("sku图片上传服务端失败!" + ex.Message);
return false;
}
}
private UcSkuImgItem currentSkuImgItem = null;
void SetCurrentSkuImgItem(UcSkuImgItem skuImgItem)
{
if (skuImgItem != null)
{
currentSkuImgItem = skuImgItem;
foreach (var item in splitContainer3.Panel2.Controls)
{
var imgItem = item as UcSkuImgItem;
if (imgItem != null && imgItem != skuImgItem)
{
imgItem.BackColor = Color.LightSteelBlue;
imgItem.chkSpecName.Checked = false;
}
}
skuImgItem.BackColor = Color.DodgerBlue;
skuImgItem.BackColor = Color.Red;
}
}
private void CefWebBrowser_AddressChanged(object sender, CefSharp.AddressChangedEventArgs e)
{
if (this.Created)
{
Invoke(new Action(() =>
{
txtUrl.Text = e.Address;
}));
}
}
private void CefWebBrowser_FrameLoadEnd(object sender, CefSharp.FrameLoadEndEventArgs e)
{
}
private void btnGoTo_Click(object sender, EventArgs e)
{
this.cefWebBrowser.Load(txtUrl.Text.Trim());
}
/// <summary>
/// 给图片打上马赛克
/// </summary>
/// <param name="original"></param>
/// <param name="mosaicRect"></param>
/// <param name="mosaicSize"></param>
/// <returns></returns>
public static Bitmap ApplyMosaicEffect(Bitmap original, Rectangle mosaicRect, int mosaicSize)
{
int width = original.Width;
int height = original.Height;
//Bitmap mosaicBitmap = new Bitmap(width, height);
//using (Graphics g = Graphics.FromImage(mosaicBitmap))
using (Graphics g = Graphics.FromImage(original))
{
//for (int x = 0; x < width; x += mosaicSize)
//{
// for (int y = 0; y < height; y += mosaicSize)
// {
// Color c = GetAverageColor(original, x, y, mosaicSize);
// Brush brush = new SolidBrush(c);
// g.FillRectangle(brush, x, y, mosaicSize, mosaicSize);
// brush.Dispose();
// }
//}
for (int x = mosaicRect.X; x < width && x < mosaicRect.Right; x += mosaicSize)
{
for (int y = mosaicRect.Y; y < height && y < mosaicRect.Bottom; y += mosaicSize)
{
Color c = GetAverageColor(original, x, y, Math.Min(mosaicRect.Right - x, mosaicSize), Math.Min(mosaicRect.Bottom - y, mosaicSize));
Brush brush = new SolidBrush(c);
g.FillRectangle(brush, x, y, Math.Min(mosaicRect.Right - x, mosaicSize), Math.Min(mosaicRect.Bottom - y, mosaicSize));
brush.Dispose();
}
}
}
//return mosaicBitmap;
return original;
}
static Color GetAverageColor(Bitmap bmp, int x, int y, int xsize, int ysize)
{
int r = 0, g = 0, b = 0;
int count = 0;
for (int i = x; i < x + xsize && i < bmp.Width; i++)
{
for (int j = y; j < y + ysize && j < bmp.Height; j++)
{
Color c = bmp.GetPixel(i, j);
r += c.R; g += c.G; b += c.B; count++;
}
}
return Color.FromArgb(r / count, g / count, b / count);
}
}
}