PPTX DOCX XLSX PDF ODP
Aspose.Imaging  cho Java
CDR

Cartoonify CDR s qua Java

Tạo các ứng dụng Java của riêng bạn thành các tệp Cartoonify CDR bằng cách sử dụng các API phía máy chủ.

Làm thế nào để Cartoonify CDR Tệp bằng Java

Hiệu ứng hoạt hình có sức hấp dẫn vốn có, thường gợi lại ký ức tuổi thơ hoài niệm. Gần như mọi bài viết thiết kế đồ họa đều tích hợp hình ảnh hoạt hình như một yếu tố không thể thiếu. Hoạt hình hóa các bức chân dung, tinh chỉnh ánh sáng, chuyển sang đen trắng, thử nghiệm màu sắc, kết hợp nhiều kỹ thuật chỉnh sửa khác nhau và tạo các hiệu ứng hình ảnh phức tạp đều có thể đạt được thông qua các bộ lọc hình ảnh như Điều chỉnh độ sáng, BinarizeFixed, Bộ lọc, Thay thế màu và ApplyMask. Những bộ lọc này có thể được áp dụng cho các bức ảnh được tải ban đầu. Bất kể chủ đề trang web của bạn là gì, hình ảnh theo phong cách Hoạt hình đều phù hợp cho mục đích minh họa. Một bài báo khoa học trở nên sống động, đồng thời nội dung đa dạng trở nên hấp dẫn người dùng hơn, từ đó tăng lượng truy cập vào website. Để hoạt hình hóa các tệp CDR, chúng tôi sẽ sử dụng [Aspose.Imaging cho Java] ( https://products.aspose.com/imaging/java ) API là một API chuyển đổi và thao tác hình ảnh giàu tính năng, mạnh mẽ và dễ sử dụng cho nền tảng Java. Bạn có thể tải xuống phiên bản mới nhất của nó trực tiếp từ Maven và cài đặt nó trong dự án dựa trên Maven của bạn bằng cách thêm các cấu hình sau vào pom.xml.

Kho

<repository>
<id>AsposeJavaAPI</id>
<name>Aspose Java API</name>
<url>https://repository.aspose.com/repo/</url>
</repository>

Dependency

<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-imaging</artifactId>
<version>version of aspose-imaging API</version>
<classifier>jdk16</classifier>
</dependency>

Các bước để Cartoonify CDR qua Java

Bạn cần [aspose-images-version-jdk16.jar] ( https://downloads.aspose.com/imaging/java ) để thử quy trình làm việc sau trong môi trường của riêng bạn.

  • Tải tệp CDR bằng phương pháp Image.Load
  • Hình ảnh biếm họa;
  • Lưu hình ảnh nén vào đĩa ở định dạng Aspose.Imaging được hỗ trợ

yêu cầu hệ thống

Aspose.Imaging cho Java được hỗ trợ trên tất cả các hệ điều hành chính. Chỉ cần đảm bảo rằng bạn có các điều kiện tiên quyết sau.

  • Đã cài đặt JDK 1.6 trở lên.
 

Hình ảnh Cartoonify CDR - Java

import com.aspose.imaging.*;
import com.aspose.imaging.fileformats.png.PngImage;
import com.aspose.imaging.imagefilters.filteroptions.FilterOptionsBase;
import com.aspose.imaging.imagefilters.filteroptions.MedianFilterOptions;
import com.aspose.imaging.imageoptions.PngOptions;
import com.aspose.imaging.masking.ImageMasking;
import com.aspose.imaging.masking.options.MaskingOptions;
import java.io.File;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
cartoonify();
public static void cartoonify()
{
filterImages(image ->
{
try (PngImage processedImage = new PngImage(image))
{
image.resize(image.getWidth() * 2, image.getHeight(), ResizeType.LeftTopToLeftTop);
ImageFilterExtensions.cartoonify(processedImage);
Graphics gr = new Graphics(image);
gr.drawImage(processedImage, processedImage.getWidth(), 0);
gr.drawLine(new Pen(Color.getDarkRed(), 3), processedImage.getWidth(), 0, processedImage.getWidth(), image.getHeight());
}
}, "cartoonify");
}
static String templatesFolder = "D:\\TestData\\";
public static void filterImages(Consumer<RasterImage> doFilter, String filterName)
{
List<String> rasterFormats = Arrays.asList("jpg", "png", "bmp", "apng", "dicom",
"jp2", "j2k", "tga", "webp", "tif", "gif", "ico");
List<String> vectorFormats = Arrays.asList("svg", "otg", "odg", "eps", "wmf", "emf", "wmz", "emz", "cmx", "cdr");
List<String> allFormats = new LinkedList<>(rasterFormats);
allFormats.addAll(vectorFormats);
allFormats.forEach(
formatExt ->
{
String inputFile = templatesFolder + "template." + formatExt;
boolean isVectorFormat = vectorFormats.contains(formatExt);
//Need to rasterize vector formats before background remove
if (isVectorFormat)
{
inputFile = rasterizeVectorImage(formatExt, inputFile);
}
String outputFile = templatesFolder + String.format("%s_%s.png", filterName, formatExt);
System.out.println("Processing " + formatExt);
try (RasterImage image = (RasterImage) Image.load(inputFile))
{
doFilter.accept(image);
//If image is multipage save each page to png to demonstrate results
if (image instanceof IMultipageImage && ((IMultipageImage) image).getPageCount() > 1)
{
IMultipageImage multiPage = (IMultipageImage) image;
final int pageCount = multiPage.getPageCount();
final Image[] pages = multiPage.getPages();
for (int pageIndex = 0; pageIndex < pageCount; pageIndex++)
{
String fileName = String.format("%s_page%d_%s.png", filterName, pageIndex, formatExt);
pages[pageIndex].save(fileName, new PngOptions());
}
}
else
{
image.save(outputFile, new PngOptions());
}
}
//Remove rasterized vector image
if (isVectorFormat)
{
new File(inputFile).delete();
}
}
);
}
private static String rasterizeVectorImage(String formatExt, String inputFile)
{
String outputFile = templatesFolder + "rasterized." + formatExt + ".png";
try (Image image = Image.load(inputFile))
{
image.save(outputFile, new PngOptions());
}
return outputFile;
}
interface IImageDataContext
{
void applyData();
}
class ImageFilterExtensions
{
public static void cartoonify(RasterImage image)
{
try (RasterImage outlines = detectOutlines(image, Color.getBlack()))
{
image.adjustBrightness(30);
image.filter(image.getBounds(), new MedianFilterOptions(7));
Graphics gr = new Graphics(image);
gr.drawImage(outlines, Point.getEmpty());
}
}
public static RasterImage detectOutlines(RasterImage image, Color outlineColor)
{
PngImage outlines = new PngImage(image);
IImageDataContext ctx = getDataContext(outlines);
applyConvolutionFilter(ctx, ConvolutionFilterOptions.getBlur());
applyConvolutionFilter(ctx, ConvolutionFilterOptions.getOutline());
ctx.applyData();
outlines.binarizeFixed((byte)30);
ImageMasking.applyMask(outlines, outlines, new MaskingOptions()
{{
setBackgroundReplacementColor(Color.getTransparent());
}});
outlines.replaceColor(Color.fromArgb(255, 255, 255), (byte)0, outlineColor);
applyConvolutionFilter(outlines, ConvolutionFilterOptions.getBlur());
return outlines;
}
public static RasterImage applyOperationToRasterImage(RasterImage image, Consumer<RasterImage> operation)
{
if (image instanceof IMultipageImage)
{
IMultipageImage multipage = (IMultipageImage) image;
for (Image page : multipage.getPages())
{
operation.accept((RasterImage) page);
}
}
else
{
operation.accept(image);
}
return image;
}
public static RasterImage applyFilter(RasterImage image, FilterOptionsBase filterOptions)
{
return applyOperationToRasterImage(image, img ->
img.filter(img.getBounds(), filterOptions));
}
public static RasterImage applyConvolutionFilter(RasterImage image, ConvolutionFilterOptions filterOptions)
{
return applyOperationToRasterImage(image, img ->
{
ImagePixelsLoader pixelsLoader = new ImagePixelsLoader(img.getBounds());
img.loadPartialArgb32Pixels(img.getBounds(), pixelsLoader);
PixelBuffer outBuffer = new PixelBuffer(img.getBounds(), new int[img.getWidth() * img.getHeight()]);
ConvolutionFilter.doFiltering(pixelsLoader.getPixelsBuffer(), outBuffer, filterOptions);
img.saveArgb32Pixels(outBuffer.getRectangle(), outBuffer.getPixels());
});
}
public static IImageDataContext getDataContext(RasterImage image)
{
if (image instanceof IMultipageImage)
{
return new MultipageDataContext(
Arrays.stream(((IMultipageImage)image).getPages()).map(page -> {
ImageDataContext buf = new ImageDataContext((RasterImage) page);
buf.setBuffer(getImageBuffer((RasterImage)page));
return buf;
}).collect(Collectors.toList()));
}
ImageDataContext buf = new ImageDataContext(image);
buf.setBuffer(getImageBuffer(image));
return buf;
}
static IPixelBuffer getImageBuffer(RasterImage img)
{
ImagePixelsLoader pixelsLoader = new ImagePixelsLoader(img.getBounds());
img.loadPartialArgb32Pixels(img.getBounds(), pixelsLoader);
return pixelsLoader.getPixelsBuffer();
}
public static IImageDataContext applyToDataContext(IImageDataContext dataContext,
Function<IPixelBuffer, IPixelBuffer> processor)
{
if (dataContext instanceof MultipageDataContext)
{
for (ImageDataContext context : (MultipageDataContext) dataContext)
{
context.setBuffer(processor.apply(context.getBuffer()));
}
}
if (dataContext instanceof ImageDataContext)
{
ImageDataContext ctx = (ImageDataContext)dataContext;
ctx.setBuffer(processor.apply(ctx.getBuffer()));
}
return dataContext;
}
public static IImageDataContext applyConvolutionFilter(IImageDataContext dataContext,
ConvolutionFilterOptions filterOptions)
{
return applyToDataContext(dataContext, buffer ->
{
PixelBuffer outBuffer = new PixelBuffer(buffer.getRectangle(), new int[buffer.getRectangle().getWidth() * buffer.getRectangle().getHeight()]);
ConvolutionFilter.doFiltering(buffer, outBuffer, filterOptions);
return outBuffer;
});
}
}
class ImageDataContext implements IImageDataContext
{
private final RasterImage image;
private IPixelBuffer buffer;
public ImageDataContext(RasterImage image)
{
this.image = image;
}
public RasterImage getImage()
{
return image;
}
public IPixelBuffer getBuffer()
{
return buffer;
}
public void setBuffer(IPixelBuffer buffer)
{
this.buffer = buffer;
}
public void applyData()
{
this.buffer.saveToImage(this.image);
}
}
class MultipageDataContext extends LinkedList<ImageDataContext> implements IImageDataContext
{
public MultipageDataContext(Collection<ImageDataContext> enumerable)
{
addAll(enumerable);
}
public void applyData()
{
for (ImageDataContext context : this)
{
context.applyData();
}
}
}
class ImagePixelsLoader implements IPartialArgb32PixelLoader
{
private final CompositePixelBuffer pixelsBuffer;
public ImagePixelsLoader(Rectangle rectangle)
{
this.pixelsBuffer = new CompositePixelBuffer(rectangle);
}
public CompositePixelBuffer getPixelsBuffer()
{
return pixelsBuffer;
}
@Override
public void process(Rectangle pixelsRectangle, int[] pixels, Point start, Point end)
{
this.pixelsBuffer.addPixels(pixelsRectangle,pixels);
}
}
interface IPixelBuffer
{
Rectangle getRectangle();
int get(int x, int y);
void set(int x, int y, int value);
void saveToImage(RasterImage image);
}
class PixelBuffer implements IPixelBuffer
{
private final Rectangle rectangle;
private final int[] pixels;
public PixelBuffer(Rectangle rectangle,int[] pixels)
{
this.rectangle = rectangle;
this.pixels = pixels;
}
@Override
public com.aspose.imaging.Rectangle getRectangle()
{
return rectangle;
}
public int[] getPixels()
{
return pixels;
}
@Override
public int get(int x, int y)
{
return pixels[getIndex(x,y)];
}
@Override
public void set(int x, int y, int value)
{
pixels[getIndex(x,y)] = value;
}
public void saveToImage(RasterImage image)
{
image.saveArgb32Pixels(this.rectangle, this.pixels);
}
public boolean contains(int x,int y)
{
return this.rectangle.contains(x,y);
}
private int getIndex(int x,int y)
{
x -= this.rectangle.getLeft();
y -= this.rectangle.getTop();
return x + y * this.rectangle.getWidth();
}
}
class CompositePixelBuffer implements IPixelBuffer
{
private final List<PixelBuffer> _buffers = new ArrayList<>();
private final Rectangle rectangle;
public CompositePixelBuffer(Rectangle rectangle)
{
this.rectangle = rectangle;
}
@Override
public com.aspose.imaging.Rectangle getRectangle()
{
return rectangle;
}
@Override
public int get(int x, int y)
{
return getBuffer(x,y).get(x, y);
}
@Override
public void set(int x, int y, int value)
{
getBuffer(x, y).set(x, y, value);
}
@Override
public void saveToImage(RasterImage image)
{
for (PixelBuffer buffer : this._buffers)
{
buffer.saveToImage(image);
}
}
public void addPixels(Rectangle rectangle,int[] pixels)
{
if(rectangle.intersectsWith(rectangle))
{
this._buffers.add(new PixelBuffer(rectangle,pixels));
}
}
private PixelBuffer getBuffer(int x,int y)
{
return this._buffers.stream().filter(b -> b.contains(x,y)).findFirst().get();
}
}
class ConvolutionFilter
{
public static void doFiltering(
IPixelBuffer inputBuffer,
IPixelBuffer outputBuffer,
ConvolutionFilterOptions options)
{
double factor = options.getFactor();
int bias = options.getBias();
double[][] kernel = options.getKernel();
int filterWidth = kernel[0].length;
int filterCenter = (filterWidth - 1) / 2;
int x, y;
int filterX, filterY, filterPx, filterPy, filterYPos, pixel;
double r, g, b, kernelValue;
int top = inputBuffer.getRectangle().getTop();
int bottom = inputBuffer.getRectangle().getBottom();
int left = inputBuffer.getRectangle().getLeft();
int right = inputBuffer.getRectangle().getRight();
for (y = top; y < bottom; y++)
{
for (x = left; x < right; x++)
{
r = 0;
g = 0;
b = 0;
for (filterY = -filterCenter; filterY <= filterCenter; filterY++)
{
filterYPos = filterY + filterCenter;
filterPy = filterY + y;
if (filterPy >= top && filterPy < bottom)
{
for (filterX = -filterCenter; filterX <= filterCenter; filterX++)
{
filterPx = filterX + x;
if (filterPx >= left && filterPx < right)
{
kernelValue = kernel[filterYPos][filterX + filterCenter];
pixel = inputBuffer.get(filterPx, filterPy);
r += ((pixel >> 16) & 0xFF) * kernelValue;
g += ((pixel >> 8) & 0xFF) * kernelValue;
b += (pixel & 0xFF) * kernelValue;
}
}
}
}
r = (factor * r) + bias;
g = (factor * g) + bias;
b = (factor * b) + bias;
r = r > 255 ? 255 : (r < 0 ? 0 : r);
g = g > 255 ? 255 : (g < 0 ? 0 : g);
b = b > 255 ? 255 : (b < 0 ? 0 : b);
outputBuffer.set(x, y, (inputBuffer.get(x, y) & 0xFF000000) | ((int)r << 16) | ((int)g << 8) | (int)b);
}
}
}
}
class ConvolutionFilterOptions
{
private double factor = 1.0;
public double getFactor()
{
return factor;
}
public void setFactor(double factor)
{
this.factor = factor;
}
private int bias = 0;
public int getBias()
{
return bias;
}
public void setBias(int bias)
{
this.bias = bias;
}
private double[][] kernel;
public double[][] getKernel()
{
return kernel;
}
public void setKernel(double[][] kernel)
{
this.kernel = kernel;
}
public ConvolutionFilterOptions()
{
}
public ConvolutionFilterOptions(double[][] kernel)
{
this.kernel = kernel;
}
public static ConvolutionFilterOptions getBlur()
{
ConvolutionFilterOptions filterOptions = new ConvolutionFilterOptions();
filterOptions.setKernel(new double[][] { { 1, 2, 1 }, { 2, 4, 2 }, { 1, 2, 1 } });
filterOptions.setFactor(0.25 * 0.25);
return filterOptions;
}
public static ConvolutionFilterOptions getSharpen()
{
return new ConvolutionFilterOptions(new double[][] { { 0, -1, 0 }, { -1, 5, -1 }, { 0, -1, 0 } });
}
public static ConvolutionFilterOptions getEmboss()
{
return new ConvolutionFilterOptions(new double[][] { { -2, -1, 0 }, { -1, 1, 1 }, { 0, 1, 2 } });
}
public static ConvolutionFilterOptions getOutline()
{
return new ConvolutionFilterOptions(new double[][] { { -1, -1, -1 }, { -1, 8, -1 }, { -1, -1, -1 } });
}
public static ConvolutionFilterOptions getBottomSobel()
{
return new ConvolutionFilterOptions(new double[][] { { -1, -2, -1 }, { 0, 0, 0 }, { 1, 2, 1 } });
}
public static ConvolutionFilterOptions getTopSobel()
{
return new ConvolutionFilterOptions(new double[][] { { 1, 2, 1 }, { 0, 0, 0 }, { -1, -2, -1 } });
}
public static ConvolutionFilterOptions getLeftSobel()
{
return new ConvolutionFilterOptions(new double[][] { { 1, 0, -1 }, { 2, 0, -2 }, { 1, 0, -1 } });
}
public static ConvolutionFilterOptions getRightSobel()
{
return new ConvolutionFilterOptions(new double[][] { { -1, 0, 1 }, { -2, 0, 2 }, { -1, 0, 1 } });
}
}
 
  • Giới thiệu về Aspose.Imaging cho API Java

    Aspose.Imaging API là một giải pháp xử lý hình ảnh để tạo, sửa đổi, vẽ hoặc chuyển đổi hình ảnh (ảnh) trong các ứng dụng. Nó cung cấp: xử lý hình ảnh đa nền tảng, bao gồm nhưng không giới hạn ở chuyển đổi giữa các định dạng hình ảnh khác nhau (bao gồm xử lý hình ảnh nhiều trang hoặc nhiều khung hình đồng nhất), các sửa đổi như vẽ, làm việc với đồ họa nguyên thủy, chuyển đổi (thay đổi kích thước, cắt, lật và xoay , binarization, thang độ xám, điều chỉnh), các tính năng thao tác hình ảnh nâng cao (lọc, phối màu, tạo mặt nạ, giải mã) và các chiến lược tối ưu hóa bộ nhớ. Đây là một thư viện độc lập và không phụ thuộc vào bất kỳ phần mềm nào cho các thao tác hình ảnh. Người ta có thể dễ dàng thêm các tính năng chuyển đổi hình ảnh hiệu suất cao với các API gốc trong các dự án. Đây là các API tại chỗ 100% riêng tư và hình ảnh được xử lý tại máy chủ của bạn.

    Cartoonify CDR s qua Ứng dụng Trực tuyến

    Cartoonify tài liệu CDR bằng cách truy cập [trang web Demos trực tiếp] của chúng tôi ( https://products.aspose.app/imaging/image-Cartoonify) . Bản demo trực tiếp có những lợi ích sau

      Không cần tải xuống hoặc thiết lập bất cứ thứ gì
      Không cần viết bất kỳ mã nào
      Chỉ cần tải lên các tệp CDR của bạn và nhấn vào nút "Cartoonify now "
      Nhận ngay liên kết tải xuống cho tệp kết quả

    CDR Những gì là CDR Định dạng tệp

    Tệp CDR là tệp hình ảnh bản vẽ vectơ được tạo nguyên bản bằng CorelDRAW để lưu trữ hình ảnh kỹ thuật số được mã hóa và nén. Một tệp bản vẽ như vậy có chứa văn bản, đường thẳng, hình dạng, hình ảnh, màu sắc và các hiệu ứng để biểu diễn vector của nội dung hình ảnh. Các tệp CDR có thể được mở bằng CorelDRAW làm ứng dụng chính và cũng có thể được chuyển đổi sang các định dạng khác như PDF, JPG, PNG, BMP và AI. Nó có thể được sử dụng để biểu diễn các dữ liệu đồ họa khác nhau như tài liệu quảng cáo, báo lá cải, phong bì và bưu thiếp. Bên cạnh CorelDRAW, các sản phẩm Corel khác như Corel Paintshop Pro và CorelDRAW Graphics suite cũng có thể mở các định dạng tệp CDR.

    Đọc thêm

    Các định dạng Cartoonify được hỗ trợ khác

    Sử dụng Java, người ta có thể dễ dàng mô tả các định dạng khác nhau bao gồm.

    APNG (Đồ họa mạng di động hoạt hình)
    BMP (Ảnh bitmap)
    ICO (Biểu tượng Windows)
    JPG (Nhóm chuyên gia nhiếp ảnh chung)
    JPEG (Nhóm chuyên gia nhiếp ảnh chung)
    DIB (Bản đồ bit độc lập với thiết bị)
    DICOM (Hình ảnh & Truyền thông Kỹ thuật số)
    DJVU (Định dạng đồ họa)
    DNG (Hình ảnh máy ảnh kỹ thuật số)
    EMF (Định dạng siêu tệp nâng cao)
    EMZ (Siêu tệp nâng cao được nén của Windows)
    GIF (Định dạng trao đổi đồ họa)
    JP2 (JPEG 2000)
    J2K (Hình ảnh nén Wavelet)
    PNG (Biểu đồ minh họa mạng lưới không dây)
    TIFF (Định dạng hình ảnh được gắn thẻ)
    TIF (Định dạng hình ảnh được gắn thẻ)
    WEBP (Raster Hình ảnh Web)
    WMF (Microsoft Windows Metafile)
    WMZ (Giao diện Windows Media Player được nén)
    TGA (Đồ họa Targa)
    SVG (Đồ họa vector có thể mở rộng)
    EPS (Ngôn ngữ PostScript được đóng gói)
    CMX (Hình ảnh trao đổi Corel)
    OTG (Tiêu chuẩn OpenDocument)
    ODG (Apache OpenOffice Draw Format)