در این قسمت تیم کدگیت را با آموزش چرخش تصاویر در جاوا (پردازش تصویر) همراهی کنید. در این جلسه ابتدا فرمول نحوه چرخش یک تصویر را توضیح داده سپس به پیاده سازی آن در جاوا میپردازیم. پیشنهاد میکنیم قبل از بررسی این جلسه، آموزشهای زیر را مطالعه کنید:
- خواندن و نوشتن تصاویر در جاوا
- بهبود تصاویر در جاوا
- تبدیل Affine در جاوا
- حلقه For در جاوا
چرخش تصاویر
فرض کنید تصویری داریم که میخواهیم آن به انداره Θ درجه بچرخوانیم. برای این کار نیاز به پارامترهای زیر داریم:
- Θ : درجه یا مقدار چرخش تصویر
- C : نقطه مرکز تصویر که به صورت (Ci,Cj) نمایش میدهیم.
- X و Y : پیکسل های تصویر ورودی
حال با دانستن پارامترهای خود، فرمول چرخش تصویر به صورت زیر میباشد:
newX = (X – Ci)* cos Θ – (Y – Cj)*sin Θ + Ci
newY = (X – Ci)* sin Θ + (Y – Cj)*cos Θ + Cj
برای چرخش تصویر به اندازه Θ کافیه فرمول بالا برای تمامی پیکسلها اعمال کنیم. دقت کنید که فرمول فوق برای مکان هر پیکسل است و مقادیر RGB تغییر نمیکنه تنها مکان پیکسل جابجا میشود.
چرخش تصاویر در جاوا
برای چرخش تصاویر در جاوا باید تمامی پیکسلهای تصاویر را خوانده و با توجه به فرمول بالا مکان جدید پیکسلها را پیدا کرده و در تصویر خروجی بریزیم. کد چرخش تصاویر به صورت زیر است:
public static void main(String[] args) {
BufferedImage img = null;
File f = null;
// read image
try {
f = new File("Rotation input.png");
img = ImageIO.read(f);
} catch (IOException e) {
System.out.println(e);
}
int width = img.getWidth();
int height = img.getHeight();
int degree = 90;
double angle = Math.toRadians(degree);
double sin = Math.sin(angle);
double cos = Math.cos(angle);
double Ci = 0.5 * (width - 1); // point to rotate about
double Cj = 0.5 * (height - 1); // center of image
BufferedImage output = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 00; x < width; x++) {
for (int y = 00; y < height; y++) {
double a = x - Ci;
double b = y - Cj;
int newX = (int) (+a * cos - b * sin + Ci);
int newY = (int) (+a * sin + b * cos + Cj);
if (newX >= 0 && newX < width && newY >= 0 && newY < height) {
output.setRGB(x, y, img.getRGB(newX, newY));
}
}
}
try {
f = new File("RotationOutput.jpg");
ImageIO.write(output, "jpg", f);
} catch (IOException e) {
System.out.println(e);
}
}
در کد فوق متغیر degree زاویه چرخش تصویر است که آن را 90 قرار دادیم. با تعیین پارامتر چرخش تصویر (که در قسمت قبل توضح دادیم) در متغیرهای newX و newY مکان جدید پیکسل را پیدا کرده و آن را درون تصویر خروجی ریختیم. خروجی کد فوق به صورت زیر میباشد: