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 Cookies = new List(); public DouBaoImgCefForm(KJDDBProduct _dbProd, string url = "", List 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(dbProd.product_json); var ucImgChangeList = new List(); 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 skuImgLst = new List(); 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 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(); } else { try { JObject jObj = JObject.Parse(html); return JsonHelper.DeserializeJsonToList(jObj["data"].ToString()); } catch(Exception ex) { BaseMsgForm.ShowError("SKU图片查询失败,请重试!" + ex.Message); return new List(); } } } 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()); } /// /// 给图片打上马赛克 /// /// /// /// /// 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); } } }