[英]How can I draw smooth pixels in a netpbm image?
我只是寫了一個小netpbm解析器,我很開心,主要繪制了參數方程式。 他們第一次看起來不錯,但是我如何擴展它並擁有看起來合法的東西? 這張照片是我的方法如何重新創建了北極猴子徽標
0.5[cos(19t) - cos(21t)]
(我想先繪制兩個余弦,然后再進行疊加)
它顯然看起來非常“酥脆”且鋒利。 我使用了盡可能小的步長,而無需花費很多時間來完成。 (0.0005,耗時<5秒)
我唯一的想法是,當繪制白色像素時,我還應使用稍微淺一些的灰色繪制其直接鄰居。 然后用更淺的灰色繪制THOSE像素的鄰居。 幾乎像白色是“溶解”或“消散”。
我沒有嘗試實現它,因為這樣做確實感覺很糟糕,我什至不確定它會產生任何接近理想效果的東西,所以我想我先問一下。
編輯:這是一個示例代碼,僅繪制了一個小螺旋
繪制循環:
for (int t = 0; t < 6 * M_PI; t += 0.0005)
{
double r = t;
new_x = 10 * r * cosf(0.1 * M_PI * t);
new_y = -10 * r * sinf(0.1 * M_PI * t);
img.SetPixel(new_x + img.img_width / 2, new_y + img.img_height / 2, 255);
}
//img is a PPM image with magic number P5 (binary grayscale)
SetPixel:
void PPMimage::SetPixel(const uint16_t x, const uint16_t y, const uint16_t pixelVal)
{
assert(pixelVal >= 0 && pixelVal <= max_greys && "pixelVal larger than image's maximum max_grey\n%d");
assert(x >= 0 && x < img_width && "X value larger than image width\n");
assert(y >= 0 && y < img_height && "Y value larger than image height\n");
img_raster[y * img_width + x] = pixelVal;
}
這就是這段代碼產生的
散點圖 (由點而不是線組成)的一種非常基本的抗鋸齒形式可以通過應用隨機舍入來實現:將畫筆視為像素大小的正方形(但請注意此模型的嚴格限制 ),居中在繪制點的非整數坐標處,並計算其與共享最接近該點的角的四個像素的重疊度。 將重疊部分視為灰度部分,並將大量像素逼近一條線,將每個像素設置為最大值 ,或者對少量離散點進行alpha 混合 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.