减小“Hello World.exe”大小

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Chenyun__/article/details/84758882

起因是有奇怪的人想要把gcc编译的hello world.exe的大小降到1kb之内。

先用正常的写法,本地的大小接近128kB。

//“hw1.c”
//language=C

#include <stdio.h> 

int main(){
	printf("Hello World");
	return 0;
}

……距离目标比较远。但是可以很明显推断重头是stdio.h。用gcc生成.o文件,看到大小接近900字节,可以预期即使把stdio.h中不要的部分剥离,可能还需要对程序主体做处理。

(比如说,把printf换成原型的putchar,hw2.exe的大小相比小了35字节——而不能理解的的是hw2.o相比大了90字节)

然后我发现踏入了一个深坑。

在linux环境下,printf最终需要系统调用write(),所以最终写成系统调用就好,网上也有很多教程、指导。

比如:

知乎问题1 这个问题下的部分回答;

知乎问题2 这个问题下的部分回答;

还有建议看《CSAPP》的,我感觉看了帮助也不是很大。

问题是exe是DOS环境的。

目前只找到 CSDN博客1 这篇羚羊挂角的博客。

……

目前的想法有:C内嵌汇编;学习下PE结构,然后反汇编;学习windows内核编程;当作无事发生过。

以上。

展开阅读全文

如何减小缩略图的大小

06-14

为什么生成的缩略图比原图还大?尤其是生成的png文件,从10几k缩略后变成100多k了!rn有没有好的办法,减小缩略图的大小?至少比原图小吧!rn public static void GetThumbnail(string originalImagePath, int width, int height, string mode)rn rn System.Drawing.Image originalImage = System.Drawing.Image.FromFile(originalImagePath);rn byte[] smallPic = null;rn int towidth = width;rn int toheight = height;rnrn int x = 0;rn int y = 0;rn int ow = originalImage.Width;rn int oh = originalImage.Height;rnrn switch (mode)rn rn case "Auto":// 自适应rn if ((double)width / (double)ow < (double)height / (double)oh)rn toheight = oh * width / ow;rn elsern towidth = ow * height / oh;rn break;rn case "HW"://指定高宽缩放(可能变形) rn break;rn case "W"://指定宽,高按比例 rn toheight = originalImage.Height * width / originalImage.Width;rn break;rn case "H"://指定高,宽按比例rn towidth = originalImage.Width * height / originalImage.Height;rn break;rn case "Cut"://指定高宽裁减(不变形) rn if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)rn rn oh = originalImage.Height;rn ow = originalImage.Height * towidth / toheight;rn y = 0;rn x = (originalImage.Width - ow) / 2;rn rn elsern rn ow = originalImage.Width;rn oh = originalImage.Width * height / towidth;rn x = 0;rn y = (originalImage.Height - oh) / 2;rn rn break;rn default:rn break;rn rnrn //新建一个bmp图片rn System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight);rnrn //新建一个画板rn Graphics g = System.Drawing.Graphics.FromImage(bitmap);rnrn //设置高质量插值法rn g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;rnrn //设置高质量,低速度呈现平滑程度rn g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;rnrn //清空画布并以透明背景色填充rn g.Clear(Color.Transparent);rnrn //在指定位置并且按指定大小绘制原图片的指定部分rn g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight),rn new Rectangle(x, y, ow, oh),rn GraphicsUnit.Pixel);rn tryrn rn bitmap.Save(@"E:\Test\smallPic.png", ImageFormat.Png);rn rn catch (System.Exception e)rn rn throw e;rn rn finallyrn rn originalImage.Dispose();rn bitmap.Dispose();rn g.Dispose();rn rn rn 论坛

没有更多推荐了,返回首页