تلاعب طبقة الشكل في Aspose.PSD for Java
نظرة عامة
تعتبر طبقات الشكل ميزة أساسية في Aspose.PSD for Java، حيث تمكنك من إنشاء وتلاعب الأشكال النائية داخل صورة PSD. في هذا المقال، سنتعمق في تلاعب طبقات الشكل باستخدام مكتبة Aspose.PSD. سنغطي مواضيع مثل الوصول إلى طبقات الشكل، وتعديل أشكال المسار، وتحديث الصورة.
إليك بعض التطبيقات الرئيسية لطبقات الشكل في Aspose.PSD for Java:
إنشاء أشكال مخصصة: تمكنك طبقات الشكل من إنشاء أشكال ناقلية مخصصة داخل صورة PSD. يمكنك تحديد مسار الشكل عن طريق تحديد سلسلة من المنحنيات بيزير ونقاط الربط. يوفر هذا المرونة في إنشاء أشكال ذات أية تعقيدات، مثل الأضلاع، والنجوم، أو الشعارات المخصصة.
تعديل الأشكال الحالية: تسمح طبقات الشكل أيضًا بتعديل خصائص الأشكال الحالية. يمكنك ضبط الموضع، والحجم، والدوران، وخصائص أخرى للشكل لتحقيق التأثير البصري المطلوب. على سبيل المثال، تغيير حجم الشكل لتكبيره أو تصغيره، دورانه إلى أي زاوية، أو ميله لإنشاء تأثيرات ثلاثية الأبعاد.
تطبيق الأنماط والتأثيرات: تدعم طبقات الشكل العديد من الأنماط والتأثيرات التي يمكن تطبيقها على الأشكال. يمكنك إضافة تدرجات، وضربات، وظلال، وتأثيرات بصرية أخرى لتعزيز مظهر الأشكال. تمكنك هذه القدرة من إنشاء تصاميم ورسوم توضيحية مذهلة بصريًا باستخدام Aspose.PSD for Java.
دمج الأشكال: باستخدام طبقات الشكل، يمكنك دمج العديد من الأشكال لإنشاء تراكيب أكثر تعقيدًا. يمكنك دمج الأشكال معًا لتشكيل أشكال مركبة أو استخدام العمليات المنطقية لطرح أو تقاطع الأشكال أو استبعادها من بعضها البعض. يُيسر ذلك إنشاء تصاميم معقدة عن طريق دمج الأشكال البسيطة بطريقة إبداعية.
يرجى الرجوع إلى المثال الكامل للاستفادة من التنفيذ التفصيلي.
مثال
public class ShapeLayerPathManipulationTest { | |
public static void main(String[] args) { | |
String sourceFileName = "ShapeLayerTest.psd"; | |
String originalOutput = "ShapeLayerTest_Res_or.psd"; | |
String updatedOutput = "ShapeLayerTest_Res_up.psd"; | |
try (PsdImage image = (PsdImage) Image.load(sourceFileName)) { | |
image.save(originalOutput); | |
for (Layer layer : image.getLayers()) { | |
// Finding Shape Layer | |
if (layer instanceof ShapeLayer) { | |
ShapeLayer shapeLayer = (ShapeLayer) layer; | |
IPath path = shapeLayer.getPath(); | |
IPathShape[] pathShapes = path.getItems(); | |
List<BezierKnotRecord[]> knotsList = new ArrayList<>(); | |
for (IPathShape pathShape : pathShapes) { | |
knotsList.add(pathShape.getItems()); | |
} | |
// Change Path Shape properties | |
PathShape newShape = new PathShape(); | |
BezierKnotRecord bn1 = new BezierKnotRecord(); | |
bn1.setLinked(true); | |
bn1.setPoints(new Point[]{ | |
PointFToResourcePoint(new PointF(20, 100), Size.to_SizeF(shapeLayer.getContainer().getSize())), | |
PointFToResourcePoint(new PointF(20, 100), Size.to_SizeF(shapeLayer.getContainer().getSize())), | |
PointFToResourcePoint(new PointF(20, 100), Size.to_SizeF(shapeLayer.getContainer().getSize())) | |
}); | |
BezierKnotRecord bn2 = new BezierKnotRecord(); | |
bn2.setLinked(true); | |
bn2.setPoints(new Point[]{ | |
PointFToResourcePoint(new PointF(20, 490), Size.to_SizeF(shapeLayer.getContainer().getSize())), | |
PointFToResourcePoint(new PointF(20, 490), Size.to_SizeF(shapeLayer.getContainer().getSize())), | |
PointFToResourcePoint(new PointF(20, 490), Size.to_SizeF(shapeLayer.getContainer().getSize())) | |
}); | |
BezierKnotRecord bn3 = new BezierKnotRecord(); | |
bn3.setLinked(true); | |
bn3.setPoints(new Point[]{ | |
PointFToResourcePoint(new PointF(490, 20), Size.to_SizeF(shapeLayer.getContainer().getSize())), | |
PointFToResourcePoint(new PointF(490, 20), Size.to_SizeF(shapeLayer.getContainer().getSize())), | |
PointFToResourcePoint(new PointF(490, 20), Size.to_SizeF(shapeLayer.getContainer().getSize())) | |
}); | |
BezierKnotRecord[] bezierKnots = {bn1, bn2, bn3}; | |
newShape.setItems(bezierKnots); | |
List<IPathShape> newShapes = Arrays.asList(pathShapes); | |
newShapes.add(newShape); | |
path.setItems(newShapes.toArray(new IPathShape[0])); | |
shapeLayer.update(); | |
image.save(updatedOutput); | |
break; | |
} | |
} | |
} | |
} | |
private static Point PointFToResourcePoint(PointF point, SizeF imageSize) { | |
double ImgToPsdRatio = 256 * 65535; | |
return new Point((int) (point.getY() * (ImgToPsdRatio / imageSize.getHeight())), (int) (point.getX() * (ImgToPsdRatio / imageSize.getWidth()))); | |
} | |
} |