我想创建取得的个人资料照片像我重视这里的一个图片:如何从个人资料照片中制作照片?
1
A
回答
3
计算每个轮廓图像的平均RGB值。
在Photoshop(或几乎任何其他图形编辑软件),创建一个包含所有这些颜色
加载要渲染和规模下来,以使照片的自定义调色板的宽度和高度以像素为单位对应于您想要在每个维度中显示的配置文件图像的数量。
使用您在步骤1中创建的调色板将图像的位深度缩小到8位或更少。确保在执行此操作时选择了“抖动”选项。
编写一个脚本来读取下采样图像并创建一个更大的图像,其中下采样图像的每个像素都被转换为单个配置文件图像。
可能的增强功能:如果存在超过256个配置文件图像,则可能会以比单个颜色表中容纳的颜色更多的颜色结束。将相似的颜色聚类在一起,并在渲染大图像时从这些组中随机选择图像。您甚至可以根据光线和阴影的分布与原始图像相应部分的分布相匹配的程度来选择图像。
0
0
我只是写了一个程序来办,今天在C#。我看到了一张照片马赛克,我突然想到你会怎么做,所以我把它们作为一种概念验证。我的第二次尝试。有点吹我的脑海:
public void BuildMosaic(string srcFolder, string picFileSrc, string mosaicFile, uint mosaicSizeMultiplier, Size numTiles)
{
// The file we're going to create a mosaic of
Image srcPic = Image.FromFile(picFileSrc);
int mosaicWidth = srcPic.Width * (int)mosaicSizeMultiplier;
int mosaicHeight = srcPic.Height * (int)mosaicSizeMultiplier;
int thumbWidth = mosaicWidth/numTiles.Width;
int thumbHeight = mosaicHeight/numTiles.Height;
List<ImageInfo> imageInfos = new List<ImageInfo>();
foreach (string filename in Directory.GetFiles(srcFolder))
{
string ext = Path.GetExtension(filename).ToUpper();
if (ext == ".JPG" || ext == ".PNG" || ext == ".GIF" || ext == ".JPEG")
{
imageInfos.Add(ImageInfo.FromImage(filename, new Size(thumbWidth, thumbHeight)));
}
}
int segmentWidth = srcPic.Width/numTiles.Width;
int segmentHeight = srcPic.Height/numTiles.Height;
Image mosaic = new Bitmap(mosaicWidth, mosaicHeight);
Bitmap segBmp = new Bitmap(segmentWidth, segmentHeight);
for (int tileX = 0; tileX < numTiles.Width; tileX++)
for(int tileY = 0; tileY < numTiles.Height; tileY++)
{
// Create a bitmap from the original image that we'll try to match a tile to.
using (Graphics g = Graphics.FromImage(segBmp))
{
g.DrawImage(srcPic, new Rectangle(0, 0, segmentWidth, segmentHeight), new Rectangle(tileX * segmentWidth, tileY * segmentHeight, segmentWidth, segmentHeight), GraphicsUnit.Pixel);
}
ImageInfo segInfo = ImageInfo.FromImage(segBmp);
// Find the matching tile and paint it onto our mosaic
ImageInfo match = segInfo.FindMatch(imageInfos.ToArray());
using (Graphics g = Graphics.FromImage(mosaic))
{
g.DrawImage(match.Thumbnail, tileX * thumbWidth, tileY * thumbHeight);
}
}
segBmp.Dispose();
mosaic.Save(mosaicFile, ImageFormat.Jpeg);
mosaic.Dispose();
}
和的imageinfo类:
public class ImageInfo
{
private ImageInfo()
{
}
public string Filename { get; private set; }
public int Blue { get; private set; }
public int Green { get; private set; }
public int Red { get; private set; }
public System.Drawing.Image Thumbnail { get; private set; }
// Calculate color distance
private float CalcDistance(ImageInfo otherImage)
{
int blueDiff = Math.Abs(Blue - otherImage.Blue);
int greenDiff = Math.Abs(Green - otherImage.Green);
int redDiff = Math.Abs(Red - otherImage.Red);
return (float) Math.Sqrt(blueDiff * blueDiff + greenDiff * greenDiff + redDiff * redDiff);
}
// Find the image with the closes matching color average
internal ImageInfo FindMatch(ImageInfo[] list)
{
ImageMatch closest = null;
foreach (ImageInfo ii in list)
{
if (closest == null)
{
closest = new ImageMatch()
{
Distance = CalcDistance(ii),
Info = ii
};
continue;
}
float dist = CalcDistance(ii);
if (dist < closest.Distance)
{
closest = new ImageMatch()
{
Distance = CalcDistance(ii),
Info = ii
};
}
}
return closest.Info;
}
internal static ImageInfo FromImage(System.Drawing.Bitmap srcBmp)
{
ImageStatistics stats = new ImageStatistics(srcBmp);
return new ImageInfo()
{
Blue = (int)stats.Blue.Mean,
Green = (int)stats.Green.Mean,
Red = (int)stats.Red.Mean
};
}
internal static ImageInfo FromImage(string filename, System.Drawing.Size thumbSize)
{
using(System.Drawing.Bitmap bmp = System.Drawing.Bitmap.FromFile(filename) as System.Drawing.Bitmap)
{
ImageStatistics stats = new ImageStatistics(bmp);
return new ImageInfo()
{
Filename = filename,
Blue = (int)stats.Blue.Mean,
Green = (int)stats.Green.Mean,
Red = (int)stats.Red.Mean,
Thumbnail = new System.Drawing.Bitmap(bmp, thumbSize)
};
}
}
internal class ImageMatch
{
public float Distance { get; set; }
public ImageInfo Info { get; set; }
}
}
第一个参数是与所有的 “平铺” 图像的目录。他们可以是任何大小。 第二个参数是您要变成拼图的图像 第三个参数是输出镶嵌文件。 四是乘数。它采用参数2中的图像,并将高度和宽度乘以此值,这就是您的镶嵌文件的大小。 最后一个参数是组成马赛克的X和Y图块的数量。
它使用AForge图像处理库。
相关问题
- 1. 如何过滤用户上传的个人资料照片从谷歌默认个人资料照片
- 2. 获取用户照片的个人资料照片的大小
- 3. Django ModelForm更新个人资料照片不保存照片
- 4. 合并facebook个人资料照片
- 5. 获取Facebook个人资料照片
- 6. 个人资料照片上传
- 7. 下载多张个人资料照片
- 8. 镆铘 - 用户个人资料照片
- 9. 用户个人资料照片 - C#
- 10. FBProfilePictureView不显示个人资料照片
- 11. 获取Twitter个人资料照片
- 12. 如何获取每个联系人的个人资料照片
- 13. 如何从Facebook获取个人资料照片
- 14. 如何从facebook注册插件获取个人资料照片?
- 15. 两个问题的照片表 - FK和个人资料照片Q
- 16. 如何在android中获取Google帐户个人资料照片?
- 17. 正在从Firebase问题中检索个人资料照片 - Swift
- 18. 显示个人资料照片而不是指向该照片的链接
- 19. 更新个人资料照片并删除当前照片。 PHP MySQL
- 20. 网站如何自动抓取个人资料照片?
- 21. 如何临时存储Facebook个人资料照片?
- 22. 如何使用'F'-logo获取Facebook个人资料照片?
- 23. 如何正确裁剪个人资料照片?
- 24. 如何自动抓取会员的个人资料照片?
- 25. 如何加载的Facebook个人资料照片
- 26. 如何显示用户的个人资料照片CakePHP的3
- 27. Facebook如何编辑个人资料照片缩略图?
- 28. 如何获取Facebook API评论者的个人资料照片?
- 29. FQL从资料图片获得的照片突然停了下来用来从好友的个人资料图片列表。照片FQL工作
- 30. instagram个人资料照片不保存/工作?