我正在开发一款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 …
我正在尝试通过使用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) 我正在使用Eclipse Memory Analyzer Tool(MAT)调查我的Android活动是否有内存泄漏.如果活动有泄漏,我会期望死实例在堆上闲置,而不是收集垃圾.为了检查这一点,我反复启动和停止(通过按"返回"按钮)活动,然后使用MAT检查堆转储.
但是我正在观察一些我无法解释的奇怪行为:活动的第一个实例(在完成强制关闭后开始)从未收集垃圾.但是,后续实例会这样做.我从使用MAT工具的检查中知道这一点:无论活动启动和停止多少次,MAT工具总是在堆上显示两个实例.第一个实例属于活动第一次启动,而第二个实例属于最近运行的活动.
任何关于可能发生的事情的想法,以及我是否应该担心这个问题.内存泄漏?建议非常感谢.
我正在开发一个自定义的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) 我想将 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)