小编Mic*_*sen的帖子

Android:BitmapFactory.decodeByteArray给出像素化位图

我正在开发一款Android应用,可以显示从Flickr下载的照片.我从字节数组中获取一个位图对象,然后从相关的Flickr URL中读取,如下所示:

BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inDither = true;
opt.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, opt);
Run Code Online (Sandbox Code Playgroud)

然后我将位图绘制到View对象的onDraw方法的画布上:

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
canvas.drawBitmap(bitmap, 0, 0, paint); 
Run Code Online (Sandbox Code Playgroud)

问题是得到的图像是像素化的,我无法弄清楚为什么; 我已经尝试了一些opt和paint对象的变种而没有运气.我的应用程序中显示的图片与原始URL中的图片之间的差异大致由以下内容证明:

图片不好,请参见左上角的像素化http://homepages.inf.ed.ac.uk/s0677975/bad.jpg

好照片,这是预期的结果http://homepages.inf.ed.ac.uk/s0677975/good.jpg

看看例如在左上角的云层中看到差异.

请注意,从项目资源加载并以类似方式绘制的JPEG图片显示正常,即没有像素化.

谁能给我一个暗示为什么会这样?

为了详细说明,字节数组是从Flickr获得的,如下所示; 这是基于Romain Guy的Photostream应用程序的代码:

InputStream in = new BufferedInputStream(url.openStream(), IO_BUFFER_SIZE);
final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
out = new BufferedOutputStream(dataStream, IO_BUFFER_SIZE);
copy(in, out);
out.flush();
final byte[] data = dataStream.toByteArray();
Run Code Online (Sandbox Code Playgroud)

PS:我还在android.developer Google小组上发布了这个问题的变体.


非常感谢你的建议 - 现在我真的很困惑!我按照你的建议做了,发现直接从下载的字节数组得到的图像确实是像素化的.但是,这是从完全相同的URL下载的,当在我的计算机上访问时,该URL不是像素化的.这是相应的Flickr URL:

http://farm3.static.flickr.com/2678/4315351421_54e8cdb8e5.jpg

更奇怪的是,当我在模拟器中而不是在我的手机(HTC Hero)上运行相同的应用程序时,没有像素化.

这怎么可能呢?

下面是我用来从URL加载位图的代码 - 它基于Romain …

android flickr image-processing

12
推荐指数
1
解决办法
3万
查看次数

AppEngine Query.fetch_async不是非常异步?

我正在尝试通过使用query.fetch_async()异步运行多个子查询来减少AppEngine查询的执行时间.但是,与串行运行查询相比,增益似乎很小.

下面是一些说明问题的最小示例代码(在Python中) - 首先是异步运行的函数:

def run_parallel(self, repeats):
    start = datetime.utcnow()

    futures = []
    for i in xrange(0, repeats):
        q = User.query()
        f = q.fetch_async(300, keys_only=True)
        futures.append(f)

    while futures:
        f = ndb.Future.wait_any(futures)
        futures.remove(f)
        results = f.get_result()
        delta_secs = (datetime.utcnow() - start).total_seconds()
        self.response.out.write("Got %d results, delta_sec: %f<br>\n" %(len(results), delta_secs))
Run Code Online (Sandbox Code Playgroud)

然后是相应串行运行的函数:

def run_serial(self, repeats):
    start = datetime.utcnow()
    for i in xrange(0, repeats):
        q = User.query()
        results = q.fetch(300, keys_only=True)
        delta_secs = (datetime.utcnow() - start).total_seconds()
        self.response.out.write("Got %d results, delta_sec: %f<br>\n" %(len(results), delta_secs))
Run Code Online (Sandbox Code Playgroud)

运行这两个函数的输出各10次(不在dev服务器上),即以下调用:

run_parallel(10) …
Run Code Online (Sandbox Code Playgroud)

google-app-engine

6
推荐指数
1
解决办法
946
查看次数

第一个活动实例永远不会被垃圾收集?

我正在使用Eclipse Memory Analyzer Tool(MAT)调查我的Android活动是否有内存泄漏.如果活动有泄漏,我会期望死实例在堆上闲置,而不是收集垃圾.为了检查这一点,我反复启动和停止(通过按"返回"按钮)活动,然后使用MAT检查堆转储.

但是我正在观察一些我无法解释的奇怪行为:活动的第一个实例(在完成强制关闭后开始)从未收集垃圾.但是,后续实例会这样做.我从使用MAT工具的检查中知道这一点:无论活动启动和停止多少次,MAT工具总是在堆上显示两个实例.第一个实例属于活动第一次启动,而第二个实例属于最近运行的活动.

任何关于可能发生的事情的想法,以及我是否应该担心这个问题.内存泄漏?建议非常感谢.

android garbage-collection memory-leaks

5
推荐指数
1
解决办法
275
查看次数

如何在自定义数据源中避免数组中的装箱字节?

我正在开发一个自定义的Spark数据源,并希望模式包含一行原始字节数组类型.

我的问题是结果字节数组中的字节被装箱:输出然后有类型WrappedArray$ofRef.这意味着每个字节都表示为java.lang.Object.虽然我可以解决这个问题,但我担心的是计算和内存开销,这对我的应用程序至关重要.我真的只想要原始数组!

下面是一个演示此行为的最小示例.

class DefaultSource extends SchemaRelationProvider with DataSourceRegister {

    override def shortName(): String = "..."

    override def createRelation(
                                    sqlContext: SQLContext,
                                    parameters: Map[String, String],
                                    schema: StructType = new StructType()
                               ): BaseRelation = {
        new DefaultRelation(sqlContext)
    }
}

class DefaultRelation(val sqlContext: SQLContext) extends BaseRelation with PrunedFilteredScan {

    override def schema = {
        StructType(
            Array(
                StructField("key", ArrayType(ByteType))
            )
        )
    }

    override def buildScan(
                              requiredColumnNames: Array[String],
                              filterArr: Array[Filter]
                          ): RDD[Row] = {
        testRDD
    }

    def testRDD = sqlContext.sparkContext.parallelize(
        List(
            Row(
                Array[Byte](1) …
Run Code Online (Sandbox Code Playgroud)

scala apache-spark apache-spark-sql

5
推荐指数
1
解决办法
698
查看次数

使用 extraOptimizations 改造 Spark SQL AST

我想将 SQL 字符串作为用户输入,然后在执行之前对其进行转换。特别是,我想修改顶级投影(select 子句),注入要由查询检索的附加列。

我希望通过使用 Catalyst 来实现这一点sparkSession.experimental.extraOptimizations。我知道我正在尝试的严格来说并不是优化(转换改变了 SQL 语句的语义),但 API 似乎仍然合适。但是,查询执行器似乎忽略了我的转换。

这是一个最小的例子来说明我遇到的问题。首先定义一个行案例类:

case class TestRow(a: Int, b: Int, c: Int)
Run Code Online (Sandbox Code Playgroud)

然后定义一个优化规则,简单地丢弃任何投影:

object RemoveProjectOptimisationRule extends Rule[LogicalPlan] {
    def apply(plan: LogicalPlan): LogicalPlan = plan transformDown {
        case x: Project => x.child
    }
}
Run Code Online (Sandbox Code Playgroud)

现在创建一个数据集,注册优化,并运行 SQL 查询:

// Create a dataset and register table.
val dataset = List(TestRow(1, 2, 3)).toDS()
val tableName: String = "testtable"
dataset.createOrReplaceTempView(tableName)

// Register "optimisation".
sparkSession.experimental.extraOptimizations =  
    Seq(RemoveProjectOptimisationRule)

// Run query.
val projected = sqlContext.sql("SELECT a FROM …
Run Code Online (Sandbox Code Playgroud)

apache-spark apache-spark-sql apache-spark-2.0

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