|
參考 題型範例 - 全國高級中等學校技藝競賽平台 工業類 題目:框選圖中物件程式 ● 請寫一隻程式,能依 LabelData.txt 檔內的座標來框選指定檔名中的物件並存檔。 ● 提供的檔案說明:本題提供 5 個圖檔及 1 個座標資訊檔 LabelData.txt 供測試。 LabelData.txt 檔中的第 1 列內容為 "ap10.jpg 1 109 133 358 373",意旨在圖檔名為 ap10.jpg 中標示 1 個矩形,其左上角座標為 (109,133)、右下角座標為 (358,373),結果如下左圖。以下解答使用 SkiaSharp 套件,請先依照下面步驟安裝套件。
/// 教育部工科技藝競賽 109 年第二題 框選圖中物件程式
/// 漆家豪 於 海青工商 2024/2/18
using System;
using System.IO;
using SkiaSharp;
class Program
{
static void Main(string[] args)
{
string labelDataPath = "LabelData.txt";
string imageFolderPath = "../../../"; // 圖片所在的資料夾
string outputFolderPath = "imageOUT";
// 如果輸出資料夾不存在,則建立一個
if (!Directory.Exists(outputFolderPath))
{
Directory.CreateDirectory(outputFolderPath);
}
string[] lines = File.ReadAllLines(imageFolderPath + labelDataPath);
foreach (string line in lines)
{
string[] parts = line.Split(' ');
string fileName = parts[0];
int numRectangles = int.Parse(parts[1]);
string imagePath = Path.Combine(imageFolderPath, fileName);
// 創建一個新的 SKBitmap 對象
using (var bitmap = SKBitmap.Decode(imagePath))
{
// 在 SKCanvas 上繪製圖形
using (var canvas = new SKCanvas(bitmap))
{
for (int i = 0; i < numRectangles; i++)
{
int startX = int.Parse(parts[2 + i * 4]);
int startY = int.Parse(parts[3 + i * 4]);
int endX = int.Parse(parts[4 + i * 4]);
int endY = int.Parse(parts[5 + i * 4]);
// 繪製矩形
using (var paint = new SKPaint { Color = SKColors.Red, IsAntialias = true })
{
paint.Style = SKPaintStyle.Stroke;
paint.StrokeWidth = 3;
SKRect rect = SKRect.Create(startX, startY, endX - startX, endY - startY);
canvas.DrawRect(rect, paint);
}
}
}
// 儲存加框後的圖片
using (var output = File.Create(imageFolderPath + outputFolderPath + "/" +fileName))
{
// 將 SKBitmap 保存為 PNG 檔案
bitmap.Encode(output, SKEncodedImageFormat.Png, 100);
}
Console.WriteLine($"在 {imagePath} 圖檔中加框,以相同檔名存入 {outputFolderPath} 資料夾中");
}
}
}
}
|