Files
CodenameEngine/source/funkin/backend/utils/BitmapUtil.hx
T
2024-04-16 01:09:15 -07:00

94 lines
2.8 KiB
Haxe

package funkin.backend.utils;
import flixel.util.FlxColor;
import openfl.display.BitmapData;
import openfl.geom.Point;
import openfl.geom.Rectangle;
class BitmapUtil {
/**
* Returns the most present color in a Bitmap.
* @param bmap Bitmap
* @return FlxColor Color that is the most present.
*/
public static function getMostPresentColor(bmap:BitmapData):FlxColor {
// map containing all the colors and the number of times they've been assigned.
var colorMap:Map<FlxColor, Float> = [];
var color:FlxColor = 0;
var fixedColor:FlxColor = 0;
for(y in 0...bmap.height) {
for(x in 0...bmap.width) {
color = bmap.getPixel32(x, y);
fixedColor = 0xFF000000 + (color % 0x1000000);
if (!colorMap.exists(fixedColor))
colorMap[fixedColor] = 0;
colorMap[fixedColor] += color.alphaFloat;
}
}
var mostPresentColor:FlxColor = 0;
var mostPresentColorCount:Float = -1;
for(c=>n in colorMap) {
if (n > mostPresentColorCount) {
mostPresentColorCount = n;
mostPresentColor = c;
}
}
return mostPresentColor;
}
/**
* Returns the most present saturated color in a Bitmap.
* @param bmap Bitmap
* @return FlxColor Color that is the most present.
*/
public static function getMostPresentSaturatedColor(bmap:BitmapData):FlxColor {
// map containing all the colors and the number of times they've been assigned.
var colorMap:Map<FlxColor, Float> = [];
var color:FlxColor = 0;
var fixedColor:FlxColor = 0;
for(y in 0...bmap.height) {
for(x in 0...bmap.width) {
color = bmap.getPixel32(x, y);
fixedColor = 0xFF000000 + (color % 0x1000000);
if (!colorMap.exists(fixedColor))
colorMap[fixedColor] = 0;
colorMap[fixedColor] += color.alphaFloat * 0.33 + (0.67 * (color.saturation * (2 * (color.lightness > 0.5 ? 0.5 - (color.lightness) : color.lightness))));
}
}
var mostPresentColor:FlxColor = 0;
var mostPresentColorCount:Float = -1;
for(c=>n in colorMap) {
if (n > mostPresentColorCount) {
mostPresentColorCount = n;
mostPresentColor = c;
}
}
return mostPresentColor;
}
/**
* Returns a new bitmap without any empty transperent space on the edges
* @param bitmap The bitmap to be cropped
*/
public static function crop(bitmap:BitmapData) {
var minX:Int = bitmap.width;
var minY:Int = bitmap.height;
var maxX:Int = 0; var maxY:Int = 0;
for (y in 0...bitmap.height)
for (x in 0...bitmap.width)
if (bitmap.getPixel32(x, y) != 0x00000000) {
if (x < minX) minX = x;
if (y < minY) minY = y;
if (x > maxX) maxX = x;
if (y > maxY) maxY = y;
}
var croppedBitmap:BitmapData = new BitmapData(maxX-minX+1, maxY-minY+1, true, 0x00000000);
croppedBitmap.copyPixels(bitmap, new Rectangle(minX, minY, croppedBitmap.width, croppedBitmap.height), new Point(0,0));
return croppedBitmap;
}
}