标签: bitmap

如何使用ImageMagick将图标连接成单个图像?

我想在网站上使用CSS精灵而不是单独的图像文件,用于大量相同大小的小图标.如何使用ImageMagick将它们连接(平铺)成一个大图像?

graphics imagemagick css-sprites bitmap

38
推荐指数
4
解决办法
2万
查看次数

在C#中快速使用Bitmaps

我需要访问Bitmap的每个像素,使用它们,然后将它们保存到Bitmap.

使用Bitmap.GetPixel()Bitmap.SetPixel(),我的程序运行缓慢.

我怎么能快速转换Bitmapbyte[]和回?

我需要byte[]length = (4 * width * height)含有各像素的RGBA数据.

.net c# graphics bitmap pixels

38
推荐指数
3
解决办法
5万
查看次数

如何用纯色填充位图?

我需要使用独特的RGB颜色创建一个24位位图(分辨率100x100像素),并将生成的图像保存到磁盘.我目前使用的SetPixel功能,但它非常慢.

Bitmap Bmp = new Bitmap(width, height);
//...
//...
Bmp.SetPixel(x,y,Color.FromARGB(redvalue, greenvalue, bluevalue));
Run Code Online (Sandbox Code Playgroud)

有比这更快的方法SetPixel吗?提前致谢.

c# image bitmap

38
推荐指数
3
解决办法
6万
查看次数

我可以比较两个相等大小的位图以确定它们是否相同的最快方法是什么?

我正在尝试编写一个函数来确定两个相等大小的位图是否相同.我现在的功能只是在每个位图中一次比较一个像素,在第一个不相等的像素处返回false.

虽然这可行,并且适用于小位图,但在生产中我将在紧密循环和更大的图像中使用它,所以我需要一种更好的方法.有没有人有任何建议?

我使用的语言就是C# - 是的,我已经在使用.LockBits方法了.=)

编辑:我编写了一些给出的建议的实现,这里是基准测试.设置:两个相同(最坏情况)的位图,大小为100x100,每个迭代次数为10,000次.结果如下:

CompareByInts (Marc Gravell) :   1107ms
CompareByMD5  (Skilldrick)   :   4222ms
CompareByMask (GrayWizardX)  :    949ms
Run Code Online (Sandbox Code Playgroud)

在CompareByInts和CompareByMask中,我使用指针直接访问内存; 在MD5方法中,我使用Marshal.Copy来检索字节数组并将其作为参数传递给MD5.ComputeHash.CompareByMask只是稍快一点​​,但考虑到上下文,我认为任何改进都是有用的.

感谢大家.=)

编辑2:忘了打开优化 - 这样做可以让GrayWizardX的答案更加强大:

CompareByInts   (Marc Gravell) :    944ms
CompareByMD5    (Skilldrick)   :   4275ms
CompareByMask   (GrayWizardX)  :    630ms
CompareByMemCmp (Erik)         :    105ms
Run Code Online (Sandbox Code Playgroud)

有趣的是,MD5方法根本没有改进.

编辑3:发布了我的答案(MemCmp),它将其他方法从水中吹走.OO

c# comparison bitmap

38
推荐指数
4
解决办法
3万
查看次数

从像素数据的字节数组创建位图

这个问题是关于如何读/写,分配和管理位图的像素数据.

下面是一个如何为像素数据分配字节数组(托管内存)并使用它创建位图的示例:

Size size = new Size(800, 600);
PixelFormat pxFormat = PixelFormat.Format8bppIndexed;
//Get the stride, in this case it will have the same length of the width.
//Because the image Pixel format is 1 Byte/pixel.
//Usually stride = "ByterPerPixel"*Width
Run Code Online (Sandbox Code Playgroud)

//但并非总是如此.更多信息在bobpowell.

int stride = GetStride(size.Width, pxFormat);
byte[] data = new byte[stride * size.Height];
GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned);
Bitmap bmp = new Bitmap(size.Width, size.Height, stride,
             pxFormat, handle.AddrOfPinnedObject());

//After doing your stuff, free the Bitmap and unpin the array.
bmp.Dispose(); …
Run Code Online (Sandbox Code Playgroud)

c# bitmap bitmapdata

38
推荐指数
3
解决办法
7万
查看次数

回收ImageView的位图

我有这样的事情:

Bitmap.Config conf = Bitmap.Config.ARGB_8888;
WeakReference<Bitmap> bm = new WeakReference<Bitmap>(Bitmap.createBitmap(3000 + 3000, 2000, conf));

Canvas canvas = new Canvas(bm.get());
canvas.drawBitmap(firstBitmap, 0, 0, null);
canvas.drawBitmap(bm, firstBitmap.getWidth(), 0, null);

imageView.setImageBitmap(bm);
Run Code Online (Sandbox Code Playgroud)

我将它应用于10个以上逐个创建的imageView.每当我创建新的ImageView时,我想从第一个回收'bm'对象,导致这个代码在那里,导致我的堆越来越多,然后抛出OutOfMemoryError,所以我这样做:

bm.recycle()
Run Code Online (Sandbox Code Playgroud)

在我将Bitmap(bm)设置为imageView对象之后.这导致ImageView的画布想要绘制回收的Bitmap的异常.

回收已在ImageView上作为图像放置的Bitmap的方法是什么?

Thanksb

java android memory-leaks bitmap

38
推荐指数
1
解决办法
4万
查看次数

如何在内部存储上保存位图

这是我的代码我想在内部存储上保存这个位图.公共布尔saveImageToInternalStorage是来自谷歌的代码,但我不知道如何使用它.当我触摸button2时,按下button1动作.

public class MainActivity extends Activity implements OnClickListener {
Button btn, btn1;
SurfaceView sv;
Bitmap bitmap;
Canvas canvas;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btn=(Button)findViewById(R.id.button1);
    btn1=(Button)findViewById(R.id.button2);
    sv=(SurfaceView)findViewById(R.id.surfaceView1);

    btn.setOnClickListener(this);
    btn1.setOnClickListener(this);

    bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);

}
@Override
public void onClick(View v) {
    canvas=sv.getHolder().lockCanvas();
    if(canvas==null) return;
    canvas.drawBitmap(bitmap, 100, 100, null);
    sv.getHolder().unlockCanvasAndPost(canvas);


}

public boolean saveImageToInternalStorage(Bitmap image) {

    try {
    // Use the compress method on the Bitmap object to write image to
    // the OutputStream
    FileOutputStream fos = openFileOutput("desiredFilename.png", Context.MODE_PRIVATE);

    // Writing the …
Run Code Online (Sandbox Code Playgroud)

android bitmap save

38
推荐指数
2
解决办法
11万
查看次数

如何将位图缓存到本机内存中

对于我的10,000点,我决定用这个很酷的网站来点缀一些东西:一种在本机内存上缓存位图的机制.

背景

Android设备的每个应用程序的内存量非常有限 - 堆的范围从16MB到128MB,具体取决于各种参数.

如果您通过此限制,则会获得OOM,当您使用位图时,这可能会发生多次.

很多时候,应用程序可能需要克服这些限制,对巨大的位图执行繁重的操作,或者只是存储它们以供以后使用,并且您需要

我想出的是一个简单的java类,它可以使事情变得更容易.

它使用JNI来存储位图数据,并能够在需要时恢复它.

为了支持该类的多个实例,我必须使用我发现的技巧(这里).

重要笔记

  • 数据仍然存储在RAM中,因此如果设备没有足够的RAM,应用程序可能会被杀死.

  • 记得尽快释放记忆.它不仅可以避免内存泄漏,而且还可以避免在您的应用程序到达后台时首先被系统优先处理.

  • 如果您不想忘记释放内存,可以在每次还原位图时释放它,或者使类实现Closable.

  • 作为一种安全措施,我已经使它在finalize()方法中自动释放其本机内存,但不要让它负责这项工作.风险太大了.当这样的事情发生时,我也写了它写入日志.

  • 它的工作方式是将整个数据复制到JNI对象中,为了还原,它从头开始创建位图并将数据放入其中.

  • 正在使用和恢复的位图采用ARGB_8888格式.当然,您可以将其更改为您想要的任何内容,只是不要忘记更改代码...

  • 大位图可能需要一些时间来存储和恢复,因此在后台线程上执行它可能是明智的.

  • 这不是一个完整的OOM解决方案,但它可能有所帮助.例如,您可以将它与您自己的LruCache结合使用,同时避免将堆内存用于缓存本身.

  • 代码仅用于存储和恢复.如果您需要执行某些操作,则需要进行一些研究.openCV可能就是答案,但是如果你想要执行一些基本的东西,你可以自己实现它们(这里是使用JNI旋转大图像的例子).如果你知道其他选择,请在这里告诉我.

希望这对某些人有用.请写下你的意见.

此外,如果您发现代码有任何问题或建议填补,请告知我们.


好的解决方案

如果您希望在JNI端执行更多操作,您可以使用我所做的这篇文章.它基于我在这里编写的代码,但允许您进行更多操作,您可以轻松添加更多自己的代码.

java-native-interface android caching native bitmap

38
推荐指数
1
解决办法
2万
查看次数

如何获取iphone上图像上像素的RGB值

我正在编写一个iPhone应用程序,并且需要在photoshop中实现与"eyedropper"工具相当的东西,在那里你可以触摸图像上的一个点并捕获相关像素的RGB值,以确定和匹配它的颜色.获取UIImage是一个简单的部分,但有没有办法将UIImage数据转换为位图表示,我可以在其中提取给定像素的信息?一个工作代码示例将是最受欢迎的,并注意我不关心alpha值.

iphone cocoa-touch image bitmap

37
推荐指数
4
解决办法
5万
查看次数

使用Entity Framework 6从SQL Server保存和检索图像(二进制)

我试图将位图图像保存到数据库

Bitmap map = new Bitmap(pictureBoxMetroMap.Size.Width, pictureBoxMetroMap.Size.Height);
Run Code Online (Sandbox Code Playgroud)

imgcontent在数据库中使用数据类型创建了一个列binary但我的问题是如何将此bitmap(映射)转换为二进制数据?

我如何从数据库中检索数据?

我用谷歌搜索它,我发现这样的东西,但它不起作用:

byte[] arr;
ImageConverter converter = new ImageConverter();
arr = (byte[])converter.ConvertTo(map, typeof(byte[]));
Run Code Online (Sandbox Code Playgroud)

c# binary entity-framework bitmap

37
推荐指数
1
解决办法
9万
查看次数