aardio可以将png图转wbmp格式嘛

阿甘 2023-8-9 1020

嘿嘿😬

准备自己写一个。

先写个wbmp图片查看器:

import win.ui;
/*DSG{{*/
mainForm = win.form(text="wbmp";right=757;bottom=467)
mainForm.add(
plus={cls="plus";left=0;top=0;right=758;bottom=468;acceptfiles=1;db=1;dl=1;dr=1;dt=1;notify=1;repeat="center";z=1}
)
/*}}*/

import fsys;
import gdip.bitmap;

function parseWbmpHex(data){
    // 解析宽度
    var width = 0;
    var index = 5;
    while (true) {
        var byte = tonumber(string.slice(data,index,index+1), 16);
        index += 2;
        width = (width << 7) | (byte & 0x7F);
        if (byte & 0x80 == 0) {
            break;
        }
    }

    // 解析高度
    var height = 0;
    while (true) {
        var byte = tonumber(string.slice(data,index,index+1), 16);
        index += 2;
        height = (height << 7) | (byte & 0x7F);
        if (byte & 0x80 == 0) {
            break;
        }
    }
    // 初始化图像数组
    var imageArray = table.array(height, width, 0);

    // 解析图像数据
    var byteIndex = index;
    for (y = 1; height; 1) {
        for (x = 1; width; 8) {
            var byte = tonumber(string.slice(data,byteIndex,byteIndex+1), 16);
            byteIndex += 2;
            for (bit = 0; 8; 1) {
                if (x + bit <= width) {
                    // 通过位移操作得到每个像素
                    var pixel = (byte >> (7 - bit)) & 1;
                    // 0为白,1为黑
                    imageArray[y][x + bit] = 1 * pixel;
                }
            }
        }
    }
    return imageArray;
}

mainForm.plus.wndproc = function(hwnd,message,wParam,lParam){
	if(message == 0x233/*_WM_DROPFILES*/){
		var wbmp_file = win.getDropFile(wParam)[1];
		if(fsys.getExtensionName(wbmp_file) != "wbmp"){
			mainForm.msgbox("仅支持wbmp格式图片");
			return;
		}
		
		// 加载WBMP文件并解析
		var hex_data = tostring(string.hex(string.load(wbmp_file),''));
		var imageArray = parseWbmpHex(hex_data);
		
		var width = #imageArray[1];
		var height = #imageArray;
		var bitmap = gdip.bitmap(width, height);
		
		for (x = 1; #imageArray; 1) {
    		for (y = 1; #imageArray[x]; 1) {
    			if(imageArray[x][y] == 0){
       				bitmap.setPixel(y-1, x-1, 0x000000);
    			}
    			else {
       				bitmap.setPixel(y-1, x-1, 0xFFFFFF);
    			}
    		}
		}
		var bitmap_img = bitmap.saveToBuffer();
		mainForm.plus.background = bitmap_img;
	}
}

mainForm.show(true);
return win.loopMessage();


最新回复 (7)
  • 光庆 2023-8-9
    0 2
    可以吧
  • 光庆 2023-8-10
    1 3
    但是没有现成的函数可用,需自己写,或调用第三方
  • 阿甘 1月前
    0 4

    用aardio解析wbmp格式的图片,然后用gidp显示出来。

    问题:gdip画出来的一个点大概占9个像素,用的

    var pen_white = gdip.pen(0x00000000,1);

    graphics.drawRectangle( pen_black, 1, 1, 1, 1);

    import win.ui;
    /*DSG{{*/
    mainForm = win.form(text="wbmp";right=757;bottom=467)
    mainForm.add(
    btnGraphics={cls="button";text="GDI+";left=47;top=344;right=195;bottom=377;db=1;dr=1;z=1}
    )
    /*}}*/
    
    function parseWbmpHex(data){
        // 解析宽度
        var width = 0;
        var index = 5;
        while (true) {
            var byte = tonumber(string.slice(data,index,index+1), 16);
            index += 2;
            width = (width << 7) | (byte & 0x7F);
            if (byte & 0x80 == 0) {
                break;
            }
        }
    
        // 解析高度
        var height = 0;
        while (true) {
            var byte = tonumber(string.slice(data,index,index+1), 16);
            index += 2;
            height = (height << 7) | (byte & 0x7F);
            if (byte & 0x80 == 0) {
                break;
            }
        }
        // 初始化图像数组
        var imageArray = table.array(height, width, 0);
    
        // 解析图像数据
        var byteIndex = index;
        for (y = 1; height; 1) {
            for (x = 1; width; 8) {
                var byte = tonumber(string.slice(data,byteIndex,byteIndex+1), 16);
                byteIndex += 2;
                for (bit = 0; 8; 1) {
                    if (x + bit <= width) {
                        // 通过位移操作得到每个像素
                        var pixel = (byte >> (7 - bit)) & 1;
                        // 0为白,1为黑
                        imageArray[y][x + bit] = 1 * pixel;
                    }
                }
            }
        }
        return imageArray;
    }
    
    // 加载WBMP文件并解析
    var hex_data = tostring(string.hex(string.load("guid.wbmp"),''));
    var imageArray = parseWbmpHex(hex_data);
    
    import gdip;
    mainForm.btnGraphics.oncommand = function(id,event){
    	var graphics = gdip.graphics(mainForm);
    	var pen_black = gdip.pen(0xFF000000,1);
    	var pen_white = gdip.pen(0x00000000,1);
    	
    	for (x = 1; #imageArray; 1) {
        	for (y = 1; #imageArray[x]; 1) {
        	    if(imageArray[x][y] == 0){
           			graphics.drawRectangle( pen_black, y, x, 1, 1);
        	    }
        	    else {
           			graphics.drawRectangle( pen_white, y, x, 1, 1);
        	    }
        	}
    	}
    	pen_black.delete();
    	pen_white.delete();
    }
    
    mainForm.show(true);
    return win.loopMessage();


  • 阿甘 1月前
    0 5
    此楼层已删除
  • 阿甘 1月前
    0 6
     mainForm.btnGraphics.oncommand = function(id,event){
    	var width = #imageArray[1];
    	var height = #imageArray;
    	var bitmap = gdip.bitmap(width, height);
    	
    	for (x = 1; #imageArray; 1) {
        	for (y = 1; #imageArray[x]; 1) {
        	    if(imageArray[x][y] == 0){
           			bitmap.setPixel(y-1, x-1, 0x000000);
        	    }
        	    else {
           			bitmap.setPixel(y-1, x-1, 0xFFFFFF);
        	    }
        	}
        }
        var img = bitmap.saveToBuffer();
        mainForm.plus.width = width;
        mainForm.plus.height = height;
        mainForm.plus.background = img;
    }

    已解决,使用bitmap很完美

  • netfox 1月前
    0 7
    bitmap效率快得不是一星半点
  • 阿甘 1月前
    0 8
    netfox bitmap效率快得不是一星半点
    确实,超流畅
返回