Kaynak kodu ile taklit x hazine ürününün kart yapımı öğreticisini gerçekleştirmek için Java'yı kullanma

Oluşturmalara ilk bakış

Gerçekleşme fikri

  • PS alt şablon resmini toka
  • Alt şablon resmini okuyun
  • Ürünün ana resmini çizin, resme yuvarlak köşeler ekleyin ve resmin kenarlarını yumuşatın
  • Ürün başlığı çizin, içerik genişliğini ve kaydırmayı hesaplayın, metin koordinat hesaplaması, yazı tipi kenar yumuşatma
  • Ürün fiyatlarını çizin
  • İki boyutlu kod resimleri, iki boyutlu kod beyaz kenar işleme oluşturun

PS alt şablon resmini toka

Bu bağlantıda, görüntüyü kesmek ve her bir öğenin koordinatlarını ve boyutunu kaydetmek için esas olarak PS kullanıyoruz.

/ ** * Ürün resim alanı * / private Rectangle imageArea = new Rectangle (64, 64, 620, 620); / ** * Başlık alanı * / private Rectangle titleArea = new Rectangle (86, 712, 300, 64); / ** * Fiyat alanı * / özel Dikdörtgen fiyatAlanı = yeni Dikdörtgen (552, 720, 118, 43); / ** * QR kodu alanı * / private Rectangle qrcodeArea = new Rectangle (87, 830, 100, 100);

Alt şablon resmini okuyun

// şablon resmini oku final BufferedImage cardImg = ImageIO.read (ClassLoader.getSystemResource (templatePath)); final Graphics2D g = cardImg.createGraphics ();

Ana ürün resmini çizin, yuvarlatılmış köşeler ekleyin, kenar yumuşatma

// kapağı çiz BufferedImage productImg = ImageIO.read (product.getProductImageUrl ()); // fileto kes productImg = setRadius (productImg, 60); // çizmek g.drawImage (productImg, imageArea.x, imageArea.y, imageArea.width, imageArea.height, null); public static BufferedImage setRadius (BufferedImage srcImage, int radius) { int w = srcImage.getWidth (); int h = srcImage.getHeight (); BufferedImage çıkışı = yeni BufferedImage (w, h, BufferedImage.TYPE_INT_ARGB); Graphics2D g2 = output.createGraphics (); g2.setComposite (AlphaComposite.SrcOut); // Kenar yumuşatma g2.setRenderingHint (RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setColor (yeni Renk (0, 0, 0)); g2.setBackground (Color.black); g2.setPaint (yeni Renk (0, 0, 0)); g2.fill (yeni RoundRectangle2D.Float (0, 0, w, h, radius, radius)); g2.setComposite (AlphaComposite.SrcAtop); g2.drawImage (srcImage, 0, 0, null); g2.dispose (); dönüş çıkışı; }

Ürün başlığı, satır sonu, koordinat hesaplama, kenar yumuşatma çizin

Metin içeriği çizmek için drawString'i kullanırken, x, y koordinatlarını doldurmanız gerekiyorsa, kodda doğrudan ps'nin üzerindeki koordinatları kullanırsanız, konumun hiç doğru olmadığını göreceksiniz Neden?

Yazı tipinin yüksekliği birkaç unsurdan oluşur: yükselme, iniş

DrawString'de kullanılan y koordinatı, taban çizgisinin y koordinatına, yani yazı tipinin bulunduğu dikdörtgenin sol üst köşesinin y koordinatına atıfta bulunur + yükselme

// Metin kenar yumuşatmayı etkinleştirin g.setRenderingHint (RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); private void drawTitle (ProductCard ürünü, Graphics2D g) { g.setColor (Color.decode ("# 666666")); g.setFont (yeni Yazı Tipi ("Şarkı Ti", Yazı Tipi.BOLD, 28)); int ascent = g.getFontMetrics (g.getFont ()). getAscent (); final Rectangle2D titleBounds = g.getFontMetrics (). getStringBounds (product.getTitle (), g); // Bir satırda en fazla 10 karakter final Dize başlığı = product.getTitle (); final int rowMaxWidth = titleArea.width; eğer (titleBounds.getWidth () > rowMaxWidth) { son karakter karakter = product.getTitle (). toCharArray (); for (int i = 0, w = 0, start = 0; i < chars.length; i ++) { w + = g.getFontMetrics (). charWidth (karakter ); eğer (w > = rowMaxWidth) { eğer (start == 0) { // ilk satırı yaz int y = titleArea.y + yükselme; g.drawString (title.substring (0, i), titleArea.x, y); start = i; w = 0; } else if (başla > 0) { // ikinci satırı yaz String part2 = title.substring (başlangıç, i); // Biraz eklemeniz gerekip gerekmediğini belirleyin eğer (titleBounds.getWidth () > rowMaxWidth * 2) bölüm2 + = "..."; // çizmek int padding = 5; int y = titleArea.y + ascent + titleArea.height / 2 + dolgu; g.drawString (bölüm2, titleArea.x, y); kırmak; } } } } Başka { g.drawString (başlık, titleArea.x, titleArea.y + yükseliş); } }

Ürün fiyatlarını çizin

Başlıktan sonra fiyat çok basit, kalan bir sorun var: Fiyat 4 haneyi aşarsa, resmi aşma problemi yaşanacaktır.Kabloyu değiştirebilir veya yazı tipi boyutunu ayarlayarak çözebilirsiniz.

g.setFont (yeni Yazı Tipi ("Arial", Yazı Tipi.BOLD, 48)); final FontMetrics fontMetrics = g.getFontMetrics (g.getFont ()); g.setColor (Color.decode ("# ff4f13")); g.drawString (product.getPrice (), priceArea.x, priceArea.y + fontMetrics.getAscent ());

QR kod resmi oluşturun, beyaz sınırı kaldırın

Bir QR kodu oluşturmak için üçüncü taraf bir bağımlılığa güvenmemiz gerekir

< !-- QR kod - > < bağımlılık > < Grup kimliği > com.google.zxing < /Grup kimliği > < artifactId > çekirdek < / artifactId > < versiyon > 3.3.0 < / version > < /bağımlılık > < bağımlılık > < Grup kimliği > com.google.zxing < /Grup kimliği > < artifactId > javase < / artifactId > < versiyon > 3.3.0 < / version > < /bağımlılık >

QR kodu oluştur

// QR kodu resmi oluştur QRCodeWriter qrCodeWriter = yeni QRCodeWriter (); BitMatrix bitMatrix = qrCodeWriter.encode (product.getProductUrl (), BarcodeFormat.QR_CODE, qrcodeArea.width, qrcodeArea.height);

Beyaz kenarlığı kaldır

genel statik BitMatrix deleteWhite (BitMatrix matrix) { int rec = matrix.getEnclosingRectangle (); int resWidth = kayıt + 1; int resHeight = kayıt + 1; BitMatrix resMatrix = new BitMatrix (resWidth, resHeight); resMatrix.clear (); for (int i = 0; i < resWidth; i ++) { for (int j = 0; j < resHeight; j ++) { eğer (matrix.get (i + rec, j + rec)) resMatrix.set (i, j); } } resMatrix döndür; }

Kaynak adres: https://gitee.com/qiaohhgz/product-tools.git

Hepsi bir arada "çevirin"! Her programcının bilmesi gereken bilgisayar korsanlığı tekniklerinin bir özeti
önceki
Veritabanının bir docker kapsayıcısında dağıtılması neden önerilmez?
Sonraki
"SQL İpuçları" MyBatis milyon limit sayfalama optimizasyonu, performans minimum 6 kat artırıldı
[Hafifçe okuyun] RabbitMQ'yu yeniden tanıyın
[Açık Kaynak Bilgileri] Visual Studio 201916.5 yayınlandı
[Açık kaynak önerisi] Yeni nesil hafif ekip işbirliği sistemi olan Kooteam 0.9.2 yayınlandı
Temel bilgisayar ağı bilgisi, sadece bu yeterli
Suikast nedir? İngiliz ev sahibi bir soruyla karşı karşıya kalan ABD sözcüsü yalan söylemeye başladı
Film Rehberi Zenginlik ve itibar kazanmak istemiyor, gemiyle birlikte ölmeyi seçiyor
Çin'in Üçüncü Nesil Tarım Makinelerinin İnovasyon Sistemini Kurmak
Turistler, Jingshan Dağı'ndaki Wanchun Pavilion'da fotoğraf çekmek için bir araya geliyor
Giriş nasıl izole edilir ve masrafları kim bırakacak? Daha açık
Çin Yeni Yılı'ndan İran "Bahar Şenliği" ne kadar bu Çinli uzmanlar zamana karşı yarışıyor
Anne ve kızı zehirlendi ve vücutlarını attı Hengyang polisi "3.14" kasıtlı cinayet davasını çözdü.
To Top